1. 導入:なぜ利用者定義例外が必要なのか
COBOLの現場では、長年「RETURN-CODE」やフラグ変数を用いたエラーハンドリングが主流でした。しかし、複雑なビジネスロジックの中で、これら汎用的なエラーコードを多用すると、「何が起きてエラーになったのか」が後から追いにくくなるという課題があります。モダンCOBOL(COBOL 2002以降)で導入された「利用者定義例外」を活用すれば、業務固有の異常系を明示的に記述でき、可読性と保守性を飛躍的に向上させることができます。
2. 基礎知識:例外処理の仕組み
利用者定義例外とは、システムが定義した例外(メモリ不足や入出力エラーなど)ではなく、開発者がプログラムの文脈に合わせて命名・定義したエラー条件のことです。
仕組みとしては、以下の2ステップで行います。
・例外の定義:プログラムのREPOSITORY段落等で例外名を宣言する。
・例外の送出と捕捉:RAISE文で例外を投げ、TRY-CATCHブロックで受け取る。
これにより、IF文の入れ子構造を解消し、正常系のロジックと異常系のロジックを分離して記述することが可能になります。
3. 実装/解決策:構造的なエラーハンドリング
具体的には、REPOSITORY段落にて例外クラスを定義し、該当する条件でRAISE文を実行します。これにより、エラー判定箇所で即座に処理を中断し、呼び出し元のCATCHブロックへ制御を移すことができます。
4. サンプルプログラム
以下は、口座残高チェックを例にした実装サンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. BANK-SAMPLE.
REPOSITORY.
- 利用者定義例外の宣言
EXCEPTION WS-INSUFFICIENT-FUNDS.
WORKING-STORAGE SECTION.
01 WS-BALANCE PIC 9(7) VALUE 1000.
01 WS-WITHDRAW PIC 9(7) VALUE 5000.
PROCEDURE DIVISION.
TRY
- 残高不足の判定と例外の送出
IF WS-WITHDRAW > WS-BALANCE THEN
RAISE EXCEPTION WS-INSUFFICIENT-FUNDS
END-IF
DISPLAY “出金処理完了”
CATCH WS-INSUFFICIENT-FUNDS
- 例外発生時のリカバリ処理
DISPLAY “エラー: 残高が不足しています。”
END-TRY.
STOP RUN.
5. 応用・注意点:現場で陥りやすい罠
実務で導入する際は、以下の点に注意してください。
・例外の乱用は避ける:例外処理はあくまで「異常系」のためのものです。通常の条件分岐(IF文で解決できるレベル)に例外を使うと、かえって処理の追跡が困難になります。
・例外の伝播:上位プログラムでキャッチされない例外は、プログラムを強制終了させる可能性があります。必ず呼び出し元で適切なCATCHが行われているか確認してください。
・コンパイラの対応状況:古いメインフレーム環境等では、COBOL 2002の全機能が実装されていない場合があります。導入前に、開発環境のコンパイラが「EXCEPTION」キーワードをサポートしているか必ず確認しましょう。
適切な例外設計は、バグの温床を減らす第一歩です。ぜひ、既存のフラグ判定を置き換えることから始めてみてください。

コメント