1. 導入
PL/Iの運用において、例外処理(ON-Unit)は避けて通れない重要な機構です。その中でも「RESUME」ステートメントは、例外発生箇所へ処理を戻すという、現代のJavaやC#等の構造化例外処理(try-catch)には存在しない極めて特殊な制御を行います。本稿では、この「復帰型例外処理」の仕組みと、レガシー資産を現代的な設計へ移行する際の注意点を解説します。
2. 基礎知識
PL/IのON-Unitは、特定の例外(ERROR、CONVERSION、SUBSCRIPTRANGE等)が発生した際に実行されるブロックです。通常、処理が終わるとON-Unitを抜けてメインフローへ戻りますが、RESUMEを指定すると、例外が発生したその命令そのもの(あるいは直後)へ制御を強制的に戻します。
これは、例えば「数値変換エラー(CONVERSION)が発生した際に、ON-Unit内で該当フィールドのデータを修正し、再度同じ命令を実行させて変換を成功させる」といった、データ整合性を担保するための高度なリカバリ手法として活用されてきました。
3. 実装/解決策
RESUMEを使用する際は、無限ループに陥らないよう、必ず「例外の原因を取り除く」処理をON-Unit内に記述する必要があります。
実行手順:
1. ON-Unitを定義する。
2. 例外発生時の修正ロジックを実装する。
3. RESUMEで制御を戻す。
4. サンプルプログラム
以下は、数値以外のデータが含まれていた場合に「0」に置換して再試行する典型的な例です。
/ CONVERSIONエラーを補足して0に置き換える例 /
DCL VAL FIXED DEC(5);
DCL INPUT_CHAR CHAR(5) INIT(‘ABC12’);
/ 例外処理の定義 /
ON CONVERSION
BEGIN;
/ 不正なデータを0に置き換える /
VAL = 0;
PUT SKIP LIST(‘データ異常を検知: 0で補完し再開します’);
/ 例外発生箇所へ制御を戻す /
RESUME;
END;
/ 変換処理の実行 /
VAL = INPUT_CHAR;
PUT SKIP LIST(‘処理完了: VALの値は’, VAL);
5. 応用・注意点
RESUMEの危険性と移行時の課題
RESUMEは強力ですが、プログラムの実行フローを非構造化にするため、保守性を著しく低下させます。また、現代の言語には「例外発生元へ戻る」という概念がないため、そのままのロジックを別言語へ移植することはできません。
現場での移行対策として、以下の対応を推奨します:
・事前バリデーション: 入力値のチェックをON-Unitに頼らず、事前に正規表現や数値判定関数で行うロジックへ書き換える。
・リトライループ: RESUMEを強引に再現するのではなく、do-whileループを用いた堅牢な読み込み処理へ構造化する。
特に、オンライン系システムでRESUMEを多用している場合、意図しない無限ループが発生し、CPUリソースを枯渇させるリスクがあります。移行時には、例外処理の「回数制限カウンタ」を設けるなど、安全装置の追加を併せて検討してください。

コメント