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で」「どの段階で」エラーが再発生したかを特定できる情報を出力してください。調査時に「無限再帰に陥ったのか、それとも新しいエラーが発生したのか」を判別できるようにしておくことが、メンテナンス性を高める鍵となります。

コメント