【PL/I学習|豆知識】メインフレームの例外処理術:SIGNAL文で独自の異常系をスマートに制御する

導入

メインフレームのPL/I開発において、「例外処理」はシステムの堅牢性を左右する重要な要素です。通常、ON-UnitはハードウェアやOSからの割り込みを検知するために使われますが、ビジネスロジック上の「在庫不足」や「論理的な整合性エラー」を、あえてシステム例外として扱うことで、エラー処理を共通化し、コードの可読性を大幅に向上させることができます。そのための鍵となるのがSIGNAL文です。

基礎知識

PL/IにおけるON-Unitとは、特定のイベント(例外条件)が発生した際に実行される「待ち受けルーチン」のことです。通常、計算エラー(ZERODIVIDE等)で発火しますが、SIGNAL文を使うと、プログラムの任意の位置で意図的にこのイベントを発生させることができます。これは、JavaやC#における「例外のスロー(throw)」と同じ役割を果たします。これにより、エラー判定ごとに煩雑なIF文をネストさせる必要がなくなり、メインのロジックとエラー処理を分離して記述できるようになります。

実装/解決策

独自のエラー条件を定義するには、まずCONDITION属性を用いて「名前付き条件」を宣言します。その後、ON CONDITION文でその条件に対する処理を定義し、必要な箇所でSIGNAL文を実行します。これにより、メインの処理フローを汚すことなく、例外発生時のリカバリ処理を一箇所に集約できます。

サンプルプログラム

以下のコードは、在庫チェックでエラーが発生した際に例外を発生させ、共通のエラー処理ルーチンへ飛ばす例です。

/ 独自条件の宣言 /
DCL MY_ERR CONDITION;

/ エラー発生時の処理を定義 /
ON CONDITION(MY_ERR) BEGIN;
PUT SKIP LIST(‘警告: 在庫不足を検知しました。処理を中断します。’);
/ ここでロールバック処理やログ出力を行う /
END;

/ メイン処理 /
DCL ZAIKO FIXED BIN(15) INIT(0);

IF ZAIKO <= 0 THEN DO; / 在庫がない場合、明示的に例外を発生させる / SIGNAL CONDITION(MY_ERR); END; PUT SKIP LIST('正常終了');

応用・注意点

現代の言語からメインフレームへ移行する際、最も注意すべきは「例外の伝播」です。SIGNALした条件は、呼び出し元のブロックにON-Unitが定義されていれば、そこまで遡って処理が実行されます。
また、システム標準のERROR条件をSIGNALすると、プログラム自体が異常終了する可能性があります。デバッグ用として便利ですが、本番環境で安易にERROR条件をSIGNALするのは避け、必ず上記サンプルコードのように、独自の条件名を定義して運用することを強く推奨します。これにより、予期せぬシステムダウンを防ぎつつ、意図した通りの例外フローを構築することが可能になります。

コメント

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