【COBOL学習|初心者向け】モダンCOBOLで実現する「例外の再スロー(RE-RAISE)」の極意

1. 導入:なぜ例外を「再スロー」するのか

プログラム開発において、エラーが発生した際にその場で全てを解決しようとするのは非常に困難です。例えば、データベース更新エラーが起きたとき、現場のサブプログラムでは「ログ出力」だけ行い、実際の「ロールバック処理」や「ユーザーへのエラー通知」はメインプログラムに任せたいというケースは多々あります。この「例外を捕まえたけれど、上位へパスする」という手法がRE-RAISE(再スロー)です。これを適切に使うことで、プログラムの責任範囲を明確にし、保守性の高いコードを書くことが可能になります。

2. 基礎知識:COBOL 2002の例外処理

COBOL 2002以降では、オブジェクト指向の概念を取り入れた強力な例外処理機構が導入されました。
TRY-CATCH-FINALLY構文を使うことで、エラーが発生した際(RAISE EXCEPTION)に、その例外情報をオブジェクトとしてキャッチできるようになりました。ここで重要なのは、キャッチした例外をそのまま握りつぶすのではなく、必要に応じてRAISE EXCEPTION EXCEPTION-OBJECTを使用して、上位のプログラムに例外を「再送」することです。これにより、階層構造を持つシステムでも、エラーの連鎖を正しく制御できます。

3. 実装:再スローの論理的な仕組み

再スローの肝は、「キャッチブロック内で再度RAISEを実行する」という点にあります。具体的な手順は以下の通りです。
1. 処理をTRYブロックで囲む。
2. CATCHブロックで例外オブジェクトを補足する。
3. CATCHブロック内で、エラーログなどを記録する。
4. 最後に「RAISE EXCEPTION EXCEPTION-OBJECT」を実行し、呼び出し元へ例外を伝播させる。
これにより、エラーの発生箇所を特定しつつ、システムの最終的な制御を呼び出し元に委ねることができます。

4. サンプルプログラム

以下は、例外をキャッチしてログ出力後に再スローする実用的なサンプルコードです。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. RE-RAISE-SAMPLE.
       
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       > 例外オブジェクトの宣言
       01 EX-OBJ OBJECT REFERENCE.
       
       PROCEDURE DIVISION.
       MAIN-LOGIC.
           TRY
               > 何らかの業務処理
               DISPLAY "業務処理を実行中..."
               > 強制的に例外を発生させる例
               RAISE EXCEPTION "致命的なエラーが発生しました"
           CATCH EX-OBJ
               > 1. 現場でのログ出力
               DISPLAY "エラーログ: 呼び出し元へ例外を再送します"
               
               > 2. 再スロー(RE-RAISE)を実行
               > キャッチしたオブジェクトをそのまま上位へ投げる
               RAISE EXCEPTION EX-OBJ
           END-TRY.
           
           GOBACK.

5. 応用・注意点:現場で役立つポイント

再スローを行う際に最も注意すべきは、「例外の握りつぶし」です。CATCHブロック内でログを出力しただけで再スローを忘れると、呼び出し元は「プログラムが正常に終了した」と誤認してしまいます。
また、再スローする際は、発生した例外をそのまま投げるのが鉄則です。新しく例外を生成し直すと、スタックトレース(エラーの発生経路)が途切れてしまい、デバッグが困難になります。必ずキャッチしたオブジェクトをそのまま使うようにしてください。この手法を使いこなすことで、大規模なCOBOLシステムでも堅牢なエラーハンドリングを実現できます。

コメント

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