1. 導入:なぜANYCONDITIONが重要なのか
メインフレームのPL/I開発において、エラー処理は非常に重要です。しかし、ファイル操作、演算、システム割り込みなど、個別のエラーごとにON文を記述していると、コードが冗長になり、メンテナンスが困難になります。
今回紹介するANYCONDITIONは、発生したあらゆる例外を一つのハンドラで受け止めるための強力な武器です。これにより、エラー発生時のログ出力や、緊急時の後処理を共通化し、堅牢なシステムを構築することが可能になります。
2. 基礎知識:ON-Unitとは何か
PL/IにおけるON-Unitとは、特定の例外(条件)が発生した際に実行されるコードブロックのことです。「もしゼロ除算が起きたらこの処理をせよ」といった指示を事前に出しておく仕組みです。
通常は`ON ZERODIVIDE`のように個別の名前を指定しますが、ANYCONDITIONを使用すると、名前を問わず「何か起きたら」という広範囲な監視が可能になります。これは、システム全体で発生する予期せぬエラーを確実にキャッチするための「最後の砦」となります。
3. 実装/解決策:ANYCONDITIONの考え方
ANYCONDITIONを実装する際は、単にエラーを無視するのではなく、「ログを出力して終了する」あるいは「特定のクリーンアップ処理を行う」という明確な目的を持つことが重要です。
また、処理の中で現在発生している例外の内容を特定したい場合は、組み込み関数である`ONCODE`や`ONSOURCE`を併用します。これにより、エラーの発生原因を特定しつつ、処理の共通化を実現できます。
4. サンプルプログラム
以下は、どのような例外が発生しても、まずはエラーコードをログ出力して安全に終了するためのサンプルです。そのままコピーしてテストにご活用ください。
/ 汎用的なエラーハンドラの設定 /
ON ANYCONDITION BEGIN;
/ 発生したエラーの内部コードを取得 /
DCL ERR_CODE FIXED BIN(31) INITIAL(ONCODE());
PUT SKIP LIST(‘システムエラーが発生しました。コード:’ || ERR_CODE);
/ 必要に応じてダンプを出力したり、外部ログへ書き出す処理を記述 /
PUT SKIP LIST(‘異常終了処理を実行します…’);
STOP; / プログラムを安全に終了 /
END;
/ 意図的な例外発生(例:ゼロ除算) /
DCL X FIXED DEC(5) INITIAL(0);
DCL Y FIXED DEC(5) INITIAL(10);
DCL Z FIXED DEC(5);
Z = Y / X; / ここで例外が発生し、上のON-Unitへ制御が移ります /
5. 応用・注意点
ANYCONDITIONを利用する際の注意点は、「範囲の限定」です。プログラム全体を一つのハンドラで覆いすぎると、本来個別に細やかな制御が必要なエラーまで一律に扱ってしまい、デバッグが困難になることがあります。
現場での設計としては、基幹となる共通処理部分に配置し、ビジネスロジック内では個別のON文で細かくケアする「階層構造」を作るのがベストプラクティスです。また、無限ループを防ぐため、エラーハンドラの中で再び同じ例外を発生させないよう、実装には十分注意してください。

コメント