導入
メインフレーム開発の現場において、予期せぬ異常終了を防ぐための例外処理(ON-Unit)は非常に重要です。特にPL/Iでは、プロシージャの呼び出し階層に応じてON-Unitが自動的にスタックされ、制御が戻る際に適切に切り替わります。この「動的なスコープ管理」を正しく理解することは、複雑なサブシステム開発における堅牢なエラーハンドリングを実現するために不可欠です。
基礎知識
PL/IのON-Unitは、特定の条件(ERROR、CONVERSION、SUBSCRIPTRANGEなど)が発生した際に実行されるコードブロックです。重要なのは、これらが「静的な定義」ではなく「動的なスタック構造」を持つ点です。
呼び出し先プロシージャでON-Unitが定義されると、それは呼び出し元のON-Unitを一時的に隠蔽(シャドーイング)します。プロシージャが終了すると、そのブロックのON-Unitは破棄され、呼び出し元の定義が再び有効になります。この仕組みにより、呼び出し先ごとに異なるエラー処理戦略を柔軟に適用できるのです。
実装/解決策
実装のポイントは、特定のサブ機能が必要とする独自のエラー処理を、そのサブ機能を呼び出す直前にON-Unitで定義し、制御が戻った後の影響を考慮する必要がない点にあります。例外ハンドラの有効範囲を「ブロックのライフサイクル」と一致させることで、グローバル変数での状態管理といった煩雑な処理を回避できます。
サンプルプログラム
以下のサンプルは、メインプロシージャとサブプロシージャで異なるERROR処理を定義し、スタックによる切り替わりを確認するものです。
/i
/ メインプロシージャ /
MAIN_PROC: PROC OPTIONS(MAIN);
/ メインの例外処理を定義 /
ON ERROR BEGIN;
PUT SKIP LIST(‘メイン側でエラーをキャッチしました’);
END;
PUT SKIP LIST(‘処理開始’);
CALL SUB_PROC;
/ サブプロシージャから戻った後に意図的にエラー発生 /
SIGNAL ERROR;
PUT SKIP LIST(‘メイン側の処理終了’);
/ サブプロシージャ /
SUB_PROC: PROC;
/ サブ側専用の例外処理(スタックされる) /
ON ERROR BEGIN;
PUT SKIP LIST(‘サブ側でエラーをキャッチしました’);
END;
PUT SKIP LIST(‘サブプロシージャを実行中’);
SIGNAL ERROR; / ここではサブ側のON-Unitが有効 /
END SUB_PROC;
END MAIN_PROC;
応用・注意点
現場で注意すべきは、「REVERTステートメント」の適切な使用です。通常はプロシージャ終了時に自動的にスタックがポップされますが、同じブロック内で動的にON-Unitを解除したい場合にはREVERTが必要です。
また、JavaやC#などのオブジェクト指向言語へ移行する際は、この階層構造を「例外のキャッチブロック」と「呼び出しスタック」の対応関係として読み替えてください。PL/IのON-Unitは、条件発生時に「どこまで遡って処理を探すか」という探索パスを自動生成していると考えると、モダンな言語へのロジック移行もスムーズに行えます。エラーハンドラのスタック漏れはメモリリークや意図しないエラー伝播の原因となるため、ブロック構造を意識したコーディングを徹底してください。

コメント