導入:なぜREVERTが必要なのか
メインフレームの言語であるPL/Iで開発をしていると、特定の処理の間だけ「エラーが起きた時の動きを変えたい」という場面に遭遇します。例えば、ファイル読み込みエラーが発生した際、通常は異常終了させたいけれど、特定のサブルーチン内では「エラーを無視して別の値を代入したい」といったケースです。このような「一時的な設定変更」と「完了後の復旧」を安全に行うために欠かせないのがREVERTステートメントです。これを使わないと、例外処理の設定が意図せず残り続け、思わぬバグを引き起こす原因になります。
基礎知識:ON-UnitとREVERTの関係
PL/Iには「ON-Unit」という例外処理機構があります。これは「ON [条件] BEGIN … END;」のように記述し、特定の割り込み(ERRORやENDFILEなど)が発生した時に実行する処理を定義するものです。
このON-Unitは、一度定義するとそのブロックを抜けるまで有効です。REVERTステートメントは、この「有効化されたON-Unitを無効化し、呼び出し元の設定に戻す」役割を持ちます。いわば「一時的なルール変更を取り消す」ためのスイッチです。
実装:REVERTの基本的な考え方
実装のポイントは「変更する前の状態に確実に戻す」ことです。以下の手順で行います。
1. 現在のON-Unitを再定義して、一時的な処理を行う。
2. 処理が終わったら、REVERTでその再定義を破棄する。
こうすることで、プログラムの他の部分に影響を与えず、局所的に例外処理をカスタマイズできます。
サンプルプログラム
以下のコードは、特定の計算処理中だけエラー処理を切り替える例です。
/ サンプルコード:REVERTの使用例 /
TEST_PROC: PROCEDURE OPTIONS(MAIN);
/ 1. 通常のエラー処理を定義(システムデフォルト等) /
ON ERROR BEGIN;
PUT SKIP LIST(‘通常のエラー処理:プログラムを終了します’);
STOP;
END;
PUT SKIP LIST(‘メイン処理開始’);
BEGIN;
/ 2. 一時的にエラー処理を上書き(REVERT対象) /
ON ERROR BEGIN;
PUT SKIP LIST(‘一時的なエラー処理:エラーを検知しましたが継続します’);
/ ここで何らかのリカバリ処理を行う /
END;
/ 何らかの計算処理(エラーが発生すると仮定) /
SIGNAL ERROR;
/ 3. 一時的なON-Unitを破棄して元の状態に戻す /
REVERT ERROR;
END;
PUT SKIP LIST(‘元のエラー処理に戻りました’);
SIGNAL ERROR; / ここでは最初(1)の処理が動く /
END TEST_PROC;
応用・注意点:現場での運用アドバイス
現代的な言語(JavaやC#など)の「try-catch」とは異なり、PL/IのON-Unitは動的なスコープを持っています。REVERTを忘れると、予期せぬ場所で古い例外処理が発動してしまう「迷子になったON-Unit」問題が発生します。
現場でのコツは、BEGINブロックとREVERTをセットで使うことです。ブロックの出口で必ずREVERTを呼び出す癖をつけることで、例外処理のスコープを明確に管理しましょう。また、移行プロジェクトでは、このREVERTの挙動をJavaのtry-catchブロックの入れ子構造に読み替えて設計するのが成功の秘訣です。

コメント