導入:なぜON-Unitを動的に書き換えるのか
メインフレームでPL/Iを扱う際、ファイル終了(ENDFILE)などのイベントに対する挙動を固定化していませんか?データ処理のフェーズごとに「エラー発生時の振る舞いを変えたい」というケースは多々あります。例えば、ヘッダー行の読み込み時と明細行の読み込み時で、エラー時の終了処理を切り替えるような場合です。ON-Unitを動的に上書きするテクニックを身につければ、複雑な条件分岐(IF文の入れ子など)を排除し、コードを劇的にスッキリさせることが可能です。
基礎知識:ON-Unitとは何か
PL/IのON-Unitは、特定のイベント(ENDFILE、CONVERSION、ERRORなど)が発生した際に実行される「割り込み処理」です。重要な点は、ON文は宣言ではなく「実行文」であるということです。プログラムの実行フローがON文を通過するたびに、そのイベントに対するハンドラが更新されます。この仕組みを理解することが、動的なハンドリング制御の第一歩です。
実装:フェーズに合わせたハンドラの切り替え
実装の基本方針は、プログラムの進捗に合わせて、同じイベントに対して異なるBEGINブロックを再定義することです。これにより、各フェーズの責任を明確に分離できます。
サンプルプログラム:フェーズ切り替えの実装例
以下は、ヘッダー読み込みフェーズとデータ読み込みフェーズで、ENDFILE時の挙動を切り替えるサンプルです。
TEST_PROC: PROCEDURE OPTIONS(MAIN);
DCL F FILE RECORD INPUT;
/ --- フェーズ1:ヘッダー読み込み時のハンドラ定義 --- /
ON ENDFILE(F) BEGIN;
PUT SKIP LIST('ヘッダー読み込み中にファイル終了:異常終了とみなします');
STOP;
END;
/ ヘッダー処理の実行 /
/ ... 読み込み処理 ... /
/ --- フェーズ2:データ読み込み時のハンドラ定義(上書き) --- /
ON ENDFILE(F) BEGIN;
PUT SKIP LIST('データ読み込み完了:正常終了処理へ');
GO TO CLOSE_FILE;
END;
/ データ処理の実行 /
/ ... 読み込み処理 ... /
CLOSE_FILE:
CLOSE FILE(F);
END TEST_PROC;
応用・注意点:現場で陥りやすい罠
この手法は非常に強力ですが、注意点も存在します。
1. 意図の不透明化
実行時にハンドラが差し替わるため、ソースコードを静的に読んでいるだけでは「今、どのON-Unitが有効か」を把握するのが難しくなります。スパゲッティコード化を防ぐため、必ずフェーズの変わり目にコメントを入れ、どのタイミングでハンドラが切り替わったかを明示してください。
2. REVERT文の活用
不要になったハンドラを元の状態に戻したい場合は、REVERT ENDFILE(F); を使用してください。これにより、直前のON-Unitの状態に復元できます。安易に上書きを繰り返すと予期せぬスタック溢れやバグを招く可能性があるため、処理の区切りでは適切にREVERTを行うのがプロの作法です。
この「動的な差し替え」を使いこなせれば、PL/Iの記述力は一段階上のレベルに達します。ぜひ保守性の高いコード設計に役立ててください。

コメント