1. 導入:なぜ「ON条件」のスタック化が重要なのか
メインフレームのシステム開発において、エラー処理は非常に重要です。しかし、プログラム全体でエラー処理を固定してしまうと、「この処理のときだけはエラーを無視したい」「特定の場所だけ特別なエラー処理をしたい」といった柔軟な対応が難しくなります。
今回紹介する「BEGINブロックによるON条件のスタック化」を活用すれば、メインのロジックに影響を与えることなく、一時的にエラー処理のルールを書き換えることができます。これは、現代のプログラミング言語における「try-catch」のような制御を、PL/Iなどのメインフレーム言語で実現する重要なテクニックです。
2. 基礎知識:ON条件とスタックの仕組み
まず「ON条件(ON-Unit)」とは、プログラム実行中に特定の例外(エラーなど)が発生した際に、システムがどう振る舞うかを定義する仕組みです。
通常、ON条件はプログラム全体で有効ですが、BEGINブロックを使用すると、そのブロックに入った瞬間に「それまでのエラー処理設定」がスタック(一時保存場所)に積まれます。そして、BEGINブロックを抜けると、自動的に元の設定に復元されます。これにより、局所的なエラー制御が可能になります。
3. 実装・解決策:局所的なエラー制御の設計
特定の手続き中だけエラーハンドリングを変更したい場合、BEGINブロックを使って以下のように構成します。
1. ブロック外で標準的なエラー処理を定義。
2. ブロック内に入り、新しいON条件を設定。
3. ブロック内で処理を実行。
4. ブロックを抜けると、自動的に外側のエラー処理に戻る。
この手順を踏むことで、エラー処理の「汚染」を防ぎ、保守性の高いコードを実現できます。
4. サンプルプログラム
以下は、特定の処理だけエラーを無視(システムデフォルトの挙動にリセット)する例です。
/ サンプル:BEGINブロックによるエラー処理の局所化 /
MAIN_PROC: PROC OPTIONS(MAIN);
/ 全体で有効なエラー処理(例:ログを出して終了) /
ON ERROR BEGIN;
PUT SKIP LIST(‘全体エラーハンドラが作動しました’);
STOP;
END;
PUT SKIP LIST(‘メイン処理開始’);
/ 一時的にエラー処理を変更するブロック /
BEGIN;
/ ここだけエラーを無視して続行する設定にする /
ON ERROR SYSTEM;
PUT SKIP LIST(‘このブロック内ではシステムデフォルトの挙動になります’);
/ 意図的なエラー発生テストなど /
SIGNAL ERROR;
END;
PUT SKIP LIST(‘ブロックを抜けたので元のエラー処理に戻っています’);
END MAIN_PROC;
5. 応用・注意点:現場で役立つアドバイス
このテクニックを使用する際は、以下の点に注意してください。
・入れ子の深さに注意:BEGINブロックを過度に深く入れ子にすると、どのON条件が有効なのかプログラムが追いづらくなります。ネストは最小限に留めるのが鉄則です。
・移行時の設計:もし将来的にJavaなどの他言語へプログラムを移行する場合、この「スタック化」されたON条件は、try-catchの階層設計にそのまま変換できます。設計段階で「どこで例外をキャッチすべきか」を明確にしておくと、移行作業が非常にスムーズになります。
・デバッグの難易度:ON条件を動的に切り替えるため、予期せぬ場所でエラーが捕捉されない場合があります。必ず単体テストで「エラー発生時の挙動」を確認するようにしましょう。

コメント