【PL/I学習|実務向け】PL/IにおけるON-Unitの「再帰的SIGNAL」を回避する堅牢な例外処理設計

1. 導入

メインフレームのPL/I開発において、ON-Unitを用いた例外処理はシステムの安定性を左右する重要な要素です。しかし、誤った実装は「無限再帰」を引き起こし、意図しないアベンド(異常終了)を招くことがあります。特に、エラーハンドラの中で再度同じエラーをSIGNALさせるコードは、デバッグ困難な「再帰ループ」の温床となります。本稿では、このリスクを回避し、安全な例外処理を実装するための設計指針を解説します。

2. 基礎知識

PL/IのON-Unitは、特定のイベント(エラー発生など)が発生した際に実行されるコードブロックです。ここで重要なのは、ON-Unitの実行中もその環境下にあるということです。もしハンドラ内でさらに同じエラーがSIGNALされると、PL/Iランユニットは「エラー処理中のエラー」として無限ループを検知し、システムデフォルトのアクション(多くの場合、即時のプログラム中断)へ強制転換します。これを防ぐには、エラーハンドラ内での例外発生を抑止する「セーフティ・ネット」の考え方が不可欠です。

3. 実装/解決策

再帰的なSIGNALを回避する最も有効な手段は、「条件のフラグ化」または「ハンドラの動的無効化」です。ON-Unit内で処理を行う際は、エラー発生のステータスをチェックし、既に処理中であればSIGNALを投げずに制御をスキップするロジックを組み込みます。また、REVERT文を使用して、ハンドラ実行中に一時的に対象のON-Unitを無効化する手法も現場で頻繁に用いられます。

4. サンプルプログラム

以下は、無限再帰を回避するための堅牢なON-Unitの実装例です。

/ 処理対象のON-Unit定義 /
ON ERROR BEGIN;
/ 既にエラー処理中であれば再帰を避ける /
IF ERR_IN_PROGRESS THEN DO;
PUT SKIP LIST(‘再帰的なエラーを検知:処理をスキップします’);
STOP; / 無限ループ回避のため強制終了 /
END;

ERR_IN_PROGRESS = ‘1’B; / エラー処理フラグを立てる /

/ エラーログ出力等の安全な処理 /
PUT SKIP LIST(‘エラー発生: ログを記録し、代替処理へ移行します’);

/ ここで再度エラーが発生しても、上記フラグによりSTOPへ分岐する /

ERR_IN_PROGRESS = ‘0’B; / フラグを戻す /
END;

/ 処理開始 /
SIGNAL ERROR; / テスト用:あえてエラーを発生させる /

5. 応用・注意点

現場で役立つ補足として、以下の3点に注意してください。

1. ハンドラ内のロジックは最小限に:
ON-Unitの中では、複雑な計算やファイルI/Oは避け、必要最小限のログ出力と状態保存に留めるのが鉄則です。
2. REVERTの活用:
特定のコードブロック内だけで一時的にON-Unitを無効にしたい場合は、REVERT文を適切に使用してください。これにより、意図しないSIGNALの連鎖を物理的に断ち切ることができます。
3. 二次エラーの検知:
システムログには、必ず「どのON-Unitで」「どの段階で」エラーが再発生したかを特定できる情報を出力してください。調査時に「無限再帰に陥ったのか、それとも新しいエラーが発生したのか」を判別できるようにしておくことが、メンテナンス性を高める鍵となります。

コメント

タイトルとURLをコピーしました