【COBOL学習|実務向け】レガシーCOBOLの防波堤:ON OVERFLOW句による安全なプログラム呼出

導入

大規模な基幹システムを運用していると、外部プログラムを呼び出す「CALL文」の挙動が、実はシステム全体の安定性を左右することに気づかされます。特に、メモリリソースが限られた環境や、複雑な階層構造を持つプログラム群において、呼び出し先がロードできない事態は致命的です。今回は、あまり意識されることが少なくなった「ON OVERFLOW」句に焦点を当て、堅牢なシステム構築のための例外処理について解説します。

基礎知識

COBOLにおける「ON OVERFLOW」は、プログラム実行時に呼び出し先のプログラムをメモリ上にロードできない場合に実行される例外処理です。
現代のOSでは仮想メモリ技術により、物理メモリ不足で直接的なロードエラーになることは稀ですが、以下のようなケースで今なお重要です。
・動的リンクライブラリ(DLLや共有オブジェクト)が正しく配置されていない場合
・システムのリソース上限(プロセスごとのメモリ制限など)に達した場合
・古いメインフレーム環境でのメモリオーバーレイ制御
これらを放置するとプログラムは異常終了(アベンド)してしまいます。ON OVERFLOWを適切に実装することで、異常終了を回避し、ログ出力やクリーンアップ処理へ安全に誘導することが可能になります。

実装/解決策

CALL文を実行する際、単にプログラム名を指定するだけでなく、エラー発生時の「逃げ道」を作ります。ON OVERFLOWに続く手続き(パラグラフ)で、以下の処理を行うのが定石です。
1. エラーメッセージのログ出力(プログラム名、発生時刻、状況)
2. 呼び出し元で必要な後処理(ファイルクローズやワークエリアの初期化)
3. 異常終了コードのセットと上位プログラムへの制御返却

サンプルプログラム

以下に、外部プログラム呼び出し時の標準的なエラーハンドリング実装例を示します。

PROCEDURE DIVISION.
MAIN-LOGIC.
DISPLAY ‘プログラム呼び出しを開始します…’

  • 外部プログラム ‘SUBPROG’ を呼び出す
  • ロードに失敗した場合は OVERFLOW-HANDLER へ制御を移す

CALL ‘SUBPROG’
ON OVERFLOW
PERFORM OVERFLOW-HANDLER
END-CALL.

DISPLAY ‘正常終了しました。’
STOP RUN.

OVERFLOW-HANDLER.

  • ここで詳細なエラーログを記録する

DISPLAY ‘【重大エラー】プログラムロードに失敗しました。’
DISPLAY ‘リソースの確認またはモジュール配置を確認してください。’

  • 必要に応じてファイルクローズ等の後処理を実行

PERFORM CLEANUP-PROCEDURE

  • 異常終了を回避し、呼び出し元へ戻るか処理を中断する

STOP RUN.

CLEANUP-PROCEDURE.
DISPLAY ‘後処理を実行中…’
CLOSE MASTER-FILE.

応用・注意点

現代のコンパイラでは「ON EXCEPTION」句が推奨されることが多いです。ON OVERFLOWは歴史的な構文ですが、多くのレガシーコンパイラで依然として有効です。
注意すべき点は、「ON OVERFLOW」はあくまでロード時のエラーを検知するものであり、呼び出し先プログラム内部で発生した論理エラーまでは検知できないということです。
現場でのバグ回避策として、以下の2点を併用することをお勧めします。
1. プログラム呼出の成否を返すステータスコードの設計(CALLの引数で戻り値を受け取る)
2. モジュール呼び出しの動的/静的リンクの使い分け(静的リンクならロードエラーはコンパイル時点で防げる)

レガシーな構文であっても、その存在理由を理解して実装することで、システムの「予期せぬ停止」を防ぐ強力な武器になります。ぜひ、既存のCALL文を見直してみてください。

コメント

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