導入:なぜON EXCEPTIONが重要なのか
業務システムにおいて、プログラムを動的に呼び出す(動的CALL)ことは柔軟な設計を実現するために非常に重要です。しかし、呼び出し先のプログラムが環境に配置されていなかったり、ロードに失敗したりした場合、何も対策をしていないとシステムは即座に異常終了(アベンド)してしまいます。本番環境で突然の停止を招かないために、「呼び出し失敗」を正しくハンドリングするON EXCEPTION句は、堅牢なシステムを作るための必須知識です。
基礎知識:動的呼び出しと例外処理
COBOLのCALL文には「静的呼び出し」と「動的呼び出し」があります。前者はコンパイル時にリンクされますが、後者は実行時にロードされます。動的呼び出しはプログラムの差し替えが容易な反面、実行時に外部プログラムが見つからないというリスクを伴います。ON EXCEPTIONは、この「実行時のロード失敗」という事象を検知し、アベンドさせる代わりに、あらかじめ定義したエラー処理ルーチンへ制御を移すための仕組みです。
実装・解決策
ON EXCEPTIONを使用する際は、単にメッセージを出すだけでなく、呼び出し先のプログラムが存在しない場合でも「次の処理に進む」か「適切にログを出力して終了コードを返す」といった設計が求められます。特に重要なのは、呼び出し失敗を隠蔽せず、運用者が後から原因を特定できるようにログを残すことです。
サンプルプログラム
以下の例は、外部プログラムを呼び出し、失敗した場合にはエラーメッセージを表示して処理を継続(あるいは終了)させる基本的な実装です。
IDENTIFICATION DIVISION.
PROGRAM-ID. CALL-EXAMPLE.
WORKING-STORAGE SECTION.
01 WS-PROG-NAME PIC X(10) VALUE "SUB-PROG".
PROCEDURE DIVISION.
MAIN-LOGIC.
> 外部プログラムを動的に呼び出す
> 失敗した場合はON EXCEPTION句へ制御が移る
CALL WS-PROG-NAME
ON EXCEPTION
DISPLAY "★エラー: プログラム " WS-PROG-NAME " が見つかりません。"
DISPLAY "★対策: 実行環境のライブラリパスを確認してください。"
> ここで必要な後処理やエラーログ出力を行う
PERFORM ERROR-HANDLING-ROUTINE
STOP RUN
END-CALL.
DISPLAY "呼び出し成功!正常処理を継続します。".
STOP RUN.
ERROR-HANDLING-ROUTINE.
> エラー時の共通処理(ログ書き出しなど)
DISPLAY "エラー処理ルーチンを実行中...".
応用・注意点:現場の運用における落とし穴
現場でよくある失敗は、ON EXCEPTIONを記述していても、その後の処理で「呼び出されたもの」として変数を操作してしまうケースです。呼び出しに失敗した場合は、戻り値やパラメータが初期化されないため、そのまま処理を続行すると二次的なバグが発生します。
また、ON EXCEPTIONはプログラムの「ロード失敗」を捕捉するものであり、呼び出し先のプログラム内で発生した論理エラーを捕捉するものではありません。呼び出し先で発生するエラーを検知したい場合は、RETURNING句を使用して戻り値(終了コード)をチェックする仕組みを併用するのが、ベテラン技術者の定石です。環境不備によるアベンドを未然に防ぎ、障害時にも「なぜ止まったか」が明確なシステムを構築しましょう。

コメント