1. 導入:なぜONステートメントの理解が重要か
メインフレームのレガシーコードを保守・改修する際、最も頭を悩ませるのが「予期せぬ異常終了」です。PL/Iにおける ONステートメント(ON-Unit) は、プログラム実行中に発生するハードウェア・ソフトウェアの例外をトラップし、制御をハンドリングする仕組みです。この仕組みを正しく理解していないと、エラー時の挙動が追跡不能になり、デバッグが極めて困難になります。本稿では、動的スコープという特性を踏まえた、堅牢なエラーハンドリング手法を解説します。
2. 基礎知識:動的スコープとON-Unitの仕組み
Javaなどの近代的言語の `try-catch` が「構文的なブロック(静的スコープ)」で範囲が決まるのに対し、PL/Iの ON-Unit は「実行パス」に基づきます。
あるブロックで `ON ERROR` が定義されると、その後の処理でエラーが発生した際、スタックを遡って「最後に定義されたON-Unit」が優先的に実行されます。これを 動的スコープ と呼びます。この性質により、共通エラー処理を呼び出し元に配置することで、階層の深い処理でも一括してエラーを捕捉することが可能です。
3. 実装と解決策
ON-Unitを実装する際は、処理完了後に必ず元の状態へ復帰させるか、あるいは異常終了を回避するために `REVERT` ステートメントを適切に使用することが肝要です。また、`SIGNAL` ステートメントを活用することで、意図的に特定の条件を発生させ、テスト容易性を高めることも可能です。
4. サンプルプログラム
以下に、ファイル読み込み時の例外を捕捉し、安全に終了させるための実践的なコード例を示します。
/ サンプルコード:ON-Unitを用いたエラーハンドリング /
/ 特定のファイル操作エラーを動的に捕捉する /
PROCEDURE MAIN;
/ ファイル読み込み時にエラーが発生した場合の動作を定義 /
ON ERROR BEGIN;
PUT SKIP LIST(‘エラーを検知:データ処理を中断します。’);
/ ここでログ出力やクリーンアップ処理を行う /
CALL CLEANUP_PROCESS;
STOP; / プログラムの正常終了 /
END;
/ 処理本体 /
CALL DATA_PROCESSING;
/ ON-Unitの無効化(必要に応じて) /
REVERT ERROR;
PROCEDURE DATA_PROCESSING;
/ 意図的に例外を発生させるテスト用コード /
SIGNAL ERROR;
END DATA_PROCESSING;
PROCEDURE CLEANUP_PROCESS;
PUT SKIP LIST(‘リソースを解放しました。’);
END CLEANUP_PROCESS;
END MAIN;
5. 応用・注意点:モダナイゼーションへの備え
現場で最も注意すべきは、「ON-Unitの残存による副作用」です。不要になったエラーハンドラが有効なまま次の処理へ移行すると、思わぬ箇所で捕捉されてしまい、原因究明が遅れるケースが多々あります。
また、Java等への移行を検討している場合、PL/Iの「動的スコープ」はそのまま移植できません。移行先では、呼び出し階層をまたいだ例外伝播を制御するために、Spring Frameworkの `@ControllerAdvice` や、AOP(アスペクト指向プログラミング)を用いたグローバル例外ハンドラの設計が必要となります。レガシーシステムの解析時には、まず「どの階層でON-Unitが定義されているか」を可視化することから始めてください。

コメント