COBOLのサブルーチンのエラー処理パターンを徹底解説!初心者でもわかる安全なプログラムの書き方
生徒
「COBOLでサブルーチンを使うときに、エラーが起きたらどうなるんですか?」
先生
「サブルーチンでエラーが起きた場合、そのままだと気づけないこともあります。でも、しっかりとしたエラー処理パターンを使えば、安全に動作を制御できるんですよ。」
生徒
「難しそうに聞こえますが、初心者でも書けるようになりますか?」
先生
「もちろんです!パソコン初心者にもわかりやすく説明しますから、一緒に学んでいきましょう。」
1. サブルーチンとは?
COBOLのサブルーチンとは、プログラムを分割して処理を再利用できる小さな部品のことです。メインプログラムからCALL文を使って、サブルーチン(別プログラム)を呼び出します。
たとえば、「合計を計算する処理」や「表示する処理」をサブルーチンとして分けておくことで、同じ処理を何回も使い回すことができます。
2. なぜエラー処理が必要なのか?
サブルーチンを使うと便利ですが、呼び出しに失敗したり、想定外のデータが渡されたりすると、プログラムが止まってしまうことがあります。
そうならないために、エラー処理を入れておくことが大切です。これにより、エラーが発生しても安全に対処でき、ユーザーに正しいメッセージを表示できます。
3. RETURN-CODEを使ったエラー通知
サブルーチンでは、RETURN-CODEという特別な変数を使って、エラーが起きたかどうかをメインプログラムに伝えることができます。
サブルーチン内で問題がなければRETURN-CODE = 0を設定し、エラーが起きたらRETURN-CODE = 1や99など、数字で状態を返します。
4. RETURN-CODEの使用例
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC A(20).
PROCEDURE DIVISION.
MOVE "ハナコ" TO WS-NAME
CALL "CHECK-NAME" USING WS-NAME
IF RETURN-CODE NOT = 0 THEN
DISPLAY "エラーが発生しました。"
ELSE
DISPLAY "正常に処理が完了しました。"
END-IF
STOP RUN.
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-NAME.
DATA DIVISION.
LINKAGE SECTION.
01 LK-NAME PIC A(20).
PROCEDURE DIVISION USING LK-NAME.
IF LK-NAME = SPACES THEN
MOVE 1 TO RETURN-CODE
ELSE
MOVE 0 TO RETURN-CODE
END-IF
EXIT PROGRAM.
5. 実行結果
正常に処理が完了しました。
6. サブルーチンが存在しない場合の対策
COBOLでは、CALLで指定したサブルーチンのファイルが見つからないとエラーになります。このようなときには、ON EXCEPTIONというキーワードを使って、エラーを検出できます。
CALL "NOT-FOUND-PGM" ON EXCEPTION
DISPLAY "サブルーチンが見つかりませんでした。"
GO TO SKIP-CALL
END-CALL.
ON EXCEPTIONは「例外(エラー)が起きたときに実行する処理」を指定する構文です。これにより、プログラムが止まらずに別の処理へ進められます。
7. サブルーチンの中で発生するエラーへの対処
たとえば、数値を0で割ってしまった場合や、読み込んだデータが足りない場合など、サブルーチンの中で発生する予期しないエラーは、RETURN-CODEで知らせるように設計します。
以下のように、条件をチェックして問題があればエラーコードを返しましょう。
IF NUMERATOR = 0 THEN
MOVE 99 TO RETURN-CODE
DISPLAY "0では割れません"
EXIT PROGRAM
END-IF
8. 呼び出し時に異常を検知するパターン
メインプログラムでは、サブルーチンの処理結果としてRETURN-CODEをチェックすることで、異常終了を防ぐことができます。
また、サブルーチン内で複数の種類のエラーをRETURN-CODEに応じて分類することで、どんな問題が起きたかを判断しやすくなります。
IF RETURN-CODE = 1 THEN
DISPLAY "入力データが空です。"
ELSE IF RETURN-CODE = 99 THEN
DISPLAY "計算中にエラーが発生しました。"
ELSE
DISPLAY "正常に終了しました。"
END-IF
9. エラー処理を入れることで得られるメリット
サブルーチンにしっかりとエラー処理を入れておくことで、以下のようなメリットがあります。
- プログラムが止まらずに安全に動作する
- 問題の原因がわかりやすくなる
- 開発チームでの修正やテストがスムーズになる
- ユーザーに丁寧なメッセージを出せる
COBOLのサブルーチンは古いシステムでも今でも多く使われています。そのため、エラー処理パターンの理解は非常に重要なのです。
まとめ
COBOLのサブルーチンを安全に活用するためには、呼び出し元とサブルーチン側の両方で丁寧なエラー処理を行うことが欠かせません。特にRETURN-CODEを使ったエラー通知は、古くからのCOBOLプログラムでも幅広く用いられている標準的な方法であり、サブルーチンが正常に動作したかどうかを正確に判断するための大切な仕組みです。サブルーチンの役割を明確にしつつ、異常が発生した際には安全に処理を戻せるように設計することで、長年稼働し続ける基幹システムでも安定した動作を維持することができます。さらにON EXCEPTIONによる呼び出し時のエラー検出や、サブルーチン内部での条件分岐を用いた異常判断は、複雑な処理を行う現場で特に有効なテクニックです。
また、RETURN-CODEに複数のエラー区分を設定しておくことで、「入力が空」「計算エラー」「データ不足」など、エラーの種類ごとに判定を行えるため、問題箇所の特定がしやすくなり、保守作業の効率化にもつながります。COBOLは企業の重要な業務を支える信頼性の高い言語として長く利用されてきましたが、その背景には、こうした堅牢なエラー処理パターンが存在します。初心者ほど「どこまで対応するべきか」が分かりにくい部分ではありますが、基本的な判断基準を理解しておくことで、安全で読みやすく、再利用性の高いプログラムを書くことができるようになります。
以下では、今回学んだ内容を踏まえて、エラー処理をより実践的に使うためのサンプルを示します。文章だけでは理解しにくい部分も、実際のCOBOLコードを見ながら確認することで、エラー処理の流れやRETURN-CODEの活用方法がより具体的にイメージできるでしょう。
サンプルプログラム:複数エラーコードの判定例
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-CHECK.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-AGE PIC 9(3).
01 WS-RESULT PIC 9(2).
PROCEDURE DIVISION.
MOVE 0 TO WS-AGE
CALL "CHECK-AGE" USING WS-AGE
MOVE RETURN-CODE TO WS-RESULT
IF WS-RESULT = 1 THEN
DISPLAY "年齢が未入力です。処理を中止します。"
ELSE IF WS-RESULT = 2 THEN
DISPLAY "年齢が不正です。再入力してください。"
ELSE IF WS-RESULT = 99 THEN
DISPLAY "サブルーチン内部で想定外のエラーが発生しました。"
ELSE
DISPLAY "年齢チェックが正常に終了しました。"
END-IF
STOP RUN.
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-AGE.
DATA DIVISION.
LINKAGE SECTION.
01 LK-AGE PIC 9(3).
PROCEDURE DIVISION USING LK-AGE.
IF LK-AGE = 0 THEN
MOVE 1 TO RETURN-CODE
EXIT PROGRAM
END-IF
IF LK-AGE < 0 OR LK-AGE > 130 THEN
MOVE 2 TO RETURN-CODE
EXIT PROGRAM
END-IF
MOVE 0 TO RETURN-CODE
EXIT PROGRAM.
このように、サブルーチン側でRETURN-CODEに細かなエラー区分を割り当てることで、メインプログラム側ではよりきめ細かなエラー処理を行えるようになります。COBOLの堅牢なエラー処理を正しく理解しておくことで、どんな規模のシステムでも安定したプログラム設計が可能になります。業務データを扱う場面が多いCOBOLだからこそ、ミスが許されない環境でも正確に処理できるよう、こうしたパターンを身につけておくことが重要なのです。
生徒
「RETURN-CODEって単なる数字だと思っていましたが、こんなに細かくエラーを分類できるんですね!」
先生
「そのとおりです。数字を工夫して使うことで、サブルーチンの状態をわかりやすくメインプログラムに伝えられるんですよ。」
生徒
「ON EXCEPTIONを使えば、そもそもの呼び出し失敗も検知できるというのが安心ですね。」
先生
「ええ、CALL時のエラーとサブルーチン内部のエラーは別物なので、それぞれに合った方法で対処する必要があります。」
生徒
「これで、COBOLのサブルーチンを使うときの怖さがかなり減りました!安全にエラー処理ができる自信がつきました。」
先生
「その調子です。正しいエラー処理を身につければ、どんな基幹システムでも安心して管理できますよ。」