【PL/I学習|実務向け】PL/I開発における「ONステートメント」の正体と現代的アーキテクチャへの移行戦略

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が定義されているか」を可視化することから始めてください。

コメント

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