COBOLバッチ処理のエラーハンドリング例を徹底解説!障害に強いプログラムの作り方
生徒
「COBOLでバッチ処理を作っているのですが、もしデータが変だったり、ファイルが開けなかったりしたら、プログラムはどうなっちゃうんですか?」
先生
「何もしないと、プログラムは突然止まってしまいます。それを防ぐために、エラーを予測して適切に対処するエラーハンドリングが必要なんです。」
生徒
「エラーハンドリングって、具体的にどうやって書けばいいんですか?」
先生
「ファイルの読み込み失敗や、計算ミスが起きそうな場所で、あらかじめチェックを入れるんですよ。実際の例を見てみましょう!」
1. エラーハンドリングとは何か?
コンピュータの世界におけるエラーハンドリングとは、プログラムの実行中に発生した問題(エラー)に対して、あらかじめ決めておいた処理を行うことを指します。特にCOBOLが得意とするバッチ処理は、夜中に大量のデータを自動で動かすことが多いため、エラーが起きたときに人間がその場で助けることができません。
もしエラーハンドリングがされていないと、システムは突然動かなくなり、翌朝の業務に大きな支障が出てしまいます。これを防ぐために、「もしファイルがなければ、管理者へメールを送って安全に止まる」といった指示を書いておくのです。未経験の方には、「もし大雨が降ったら、遠足を中止にして全員に連絡網を回す」という事前準備をイメージしてもらうと分かりやすいでしょう。
2. ファイルオープン時のステータスチェック
バッチ処理の基本はファイルの読み書きです。しかし、指定した場所に使いたいファイルが存在しなかったり、他のプログラムが使用中でロックされていたりすると、エラーが発生します。COBOLではFILE STATUSという仕組みを使って、ファイルの開閉が成功したかどうかを確認します。
成功したときは特定のコード(一般的には00)が返されますが、失敗すると別の番号が返ってきます。これを見て、エラーかどうかを判断します。例えば、重要な売り上げファイルが見つからない場合に、無理に処理を進めず警告を出して止めるようなロジックが一般的です。
以下は、ファイルが正常に開けたかを確認するシンプルなコード例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. FILE-ERR-CHECK.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SALES-FILE ASSIGN TO "SALES.DAT"
FILE STATUS IS FS-CODE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FS-CODE PIC X(02).
PROCEDURE DIVISION.
OPEN INPUT SALES-FILE.
IF FS-CODE NOT = "00"
DISPLAY "【重大エラー】ファイルが開けません。ステータス:" FS-CODE
STOP RUN
END-IF.
DISPLAY "ファイルを正常に開きました。"
CLOSE SALES-FILE.
STOP RUN.
3. 算術オーバーフローとON SIZE ERROR
計算結果が、あらかじめ用意しておいた変数の箱に入り切らなくなることをオーバーフローと言います。例えば、4桁の数字しか入らない場所に1万という数字を入れようとすると、正しい値が保持できなくなり、データが壊れてしまいます。
COBOLにはこれを防ぐためのON SIZE ERRORという命令があります。これを使うことで、計算ミスが起きたときに「計算を無視する」「エラーログを出す」「特別な値を代入する」といった柔軟な対応が可能になります。お金を扱う銀行のシステムなどでは、このチェックが非常に重要になります。
計算結果が溢れてしまったときに対処するプログラム例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. CALC-ERR-HANDLING.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUM-A PIC 9(03) VALUE 500.
01 NUM-B PIC 9(03) VALUE 600.
01 ANS-V PIC 9(03).
PROCEDURE DIVISION.
ADD NUM-A TO NUM-B GIVING ANS-V
ON SIZE ERROR
DISPLAY "エラー:合計が1000を超えて桁あふれしました。"
MOVE 999 TO ANS-V
NOT ON SIZE ERROR
DISPLAY "計算結果は " ANS-V " です。"
END-ADD.
STOP RUN.
4. 不正なデータ形式を見抜く数値チェック
バッチ処理に入ってくるデータの中に、数字であるべき場所に文字(あいうえお、など)が混ざっていることがあります。これをそのまま計算に使おうとすると、システムは「計算できない!」と叫んで異常終了してしまいます。これを防ぐのが数値チェックです。
COBOLでは「IS NUMERIC」という命令を使って、その項目が正しい数字かどうかを一瞬で判断できます。もし数字でない場合は、そのデータ一件だけをエラーリストに書き出し、残りの正常なデータは処理を続けるという工夫をします。これにより、たった一人の入力ミスで数万人の処理が止まってしまうのを防ぐことができます。
5. リターンコードによる後続ジョブの制御
一つのバッチ処理が終わると、その結果を次の処理に伝える必要があります。これをリターンコード(または終了コード)と呼びます。一般的に、0は「成功」、4は「注意」、8以上は「異常」といった意味を持ちます。
エラーハンドリングのコツは、プログラムの最後に適切なリターンコードをセットして終了することです。これにより、バッチを管理しているシステムが「前の処理が失敗したから、次の処理は中止しよう」と賢く判断できるようになります。バトンを渡すリレーに例えると、転んでしまったら次の走者に「走るな!」と合図を送るような仕組みです。
6. 予期せぬエラーを捕まえる一括処理
想定外のエラーが発生したときのために、プログラム全体を保護する考え方もあります。これを専門用語で例外処理と呼ぶこともありますが、COBOLでは一つひとつの操作に対してエラー時の動きを指定するのが基本です。
特に最近のCOBOLでは、データベースアクセス時などに一括してエラーを検知する命令も増えています。大事なのは、エラーが起きた場所を特定できるように、必ず「どのステップで何が起きたか」を画面やファイルに書き出す(ログ出力)ようにしておくことです。これが後の原因調査を何倍も楽にしてくれます。
7. リトライ処理で一時的な問題を回避
エラーの中には、もう一度やり直せば成功するものがあります。例えば、一時的なネットワークの混雑でファイルにアクセスできなかった場合などです。これを自動でやり直すことをリトライ処理と言います。
エラーが起きた瞬間に諦めるのではなく、数秒待ってから最大3回まで挑戦する、といった仕組みを組み込みます。ただし、何度やってもダメな場合に無限ループにならないよう、回数制限を設けるのが運用管理のポイントです。粘り強く対応する賢いプログラムを作るコツですね。
繰り返しリトライを試みるイメージのコードです。
IDENTIFICATION DIVISION.
PROGRAM-ID. RETRY-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RETRY-CNT PIC 9(01) VALUE 0.
01 SUCCESS-FLG PIC X(01) VALUE "N".
PROCEDURE DIVISION.
PERFORM UNTIL SUCCESS-FLG = "Y" OR RETRY-CNT > 3
ADD 1 TO RETRY-CNT
DISPLAY RETRY-CNT "回目の接続を試みます..."
* 本来はここで接続処理を行う
IF RETRY-CNT = 2
MOVE "Y" TO SUCCESS-FLG
END-IF
END-PERFORM.
IF SUCCESS-FLG = "Y"
DISPLAY "接続に成功しました。"
ELSE
DISPLAY "接続を断念しました。"
END-IF.
STOP RUN.
8. エラーログの重要性と書き出し方
エラーハンドリングの仕上げは、状況を正確に記録することです。これをエラーログと言います。ログには「発生日時」「プログラム名」「エラーの種類」「どのデータで起きたか」を詳しく書きます。
運用管理者は、翌朝このログを見て原因を分析します。ログの内容が不十分だと、「何か分からないけれど止まった」という最悪の状況になり、復旧が遅れてしまいます。初心者の方がプログラムを書くときは、少し過剰なくらいにDISPLAY命令を使って状況を表示させる癖をつけると、上達が早くなります。
9. テストで見つけるエラーのパターン
素晴らしいエラーハンドリングを作るためには、わざとエラーを起こすテストが欠かせません。これを異常系テストと呼びます。ファイルをわざと消したり、とんでもなく大きい数字を入れたりして、プログラムが想定通りに動くかを確かめます。
本番でエラーが起きるのは怖いことですが、テストでエラーを見つけるのはとても良いことです。あらゆるパターンを試しておくことで、鉄壁のバッチ処理が完成します。自信を持ってシステムを動かすために、エラーと仲良くなることが大切です。
10. 最後に必要なクリーンアップ処理
エラーが発生して処理を中断するとき、忘れてはいけないのが後片付けです。これをクリーンアップと言います。開きっぱなしのファイルを閉じたり、データベースの接続を切ったりする作業です。
これを忘れると、次にプログラムを動かそうとしたときに「前のがまだ残っていて動かせない」という二次災害を引き起こします。正常に終わるときも、エラーで終わるときも、必ず最後にはお掃除をしてから終了する。これが、長年愛されるCOBOLプログラムの美しいお作法です。以下は、終了前に必ずメッセージを出すイメージです。
IDENTIFICATION DIVISION.
PROGRAM-ID. FINAL-EXIT.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 EXIT-MSG PIC X(20) VALUE "処理を終了します。".
PROCEDURE DIVISION.
* どんなエラーがあってもここを通るように設計
DISPLAY "後片付けを開始します。"
DISPLAY EXIT-MSG.
STOP RUN.