COBOLのCLIツール入力・出力エラーハンドリング!初心者向け徹底解説
生徒
「COBOLのプログラムを動かしているとき、読み込むファイルがなかったり、書き込みに失敗したりすると、プログラムが突然止まって困っています。」
先生
「それは『エラーハンドリング』ができていないからですね。予期せぬトラブルが起きても、プログラムが安全に処理を続けたり、分かりやすいメッセージを出したりする仕組みのことです。」
生徒
「エラーハンドリング……難しそうな名前ですね。パソコンをあまり触ったことがない私でも、CLIツールで正しく入出力を管理できるようになりますか?」
先生
「大丈夫ですよ!基本的な書き方と、エラーを見つけるためのポイントさえ押さえれば、誰でも頑丈なプログラムが作れます。一緒に見ていきましょう!」
1. エラーハンドリングとは?トラブルに備える心の準備
プログラミングにおけるエラーハンドリングとは、プログラムの実行中に発生する「困った事態(エラー)」をあらかじめ予想して、その対策を組み込んでおくことを指します。パソコン初心者の方には、外出するときに「雨が降るかもしれないから、傘を持っていく」という準備をイメージしてもらうのが一番分かりやすいでしょう。
特にCLI(コマンドラインインターフェース)ツールでは、マウスを使わず文字だけで命令を出すため、プログラムが突然止まってしまうと、何が起きたのか全く分からなくなってしまいます。そこで、ファイルが開けなかったときに「ファイルが見つかりません!」と丁寧に教えてあげる仕組みが必要なのです。この優しさが、使いやすいツールを作る秘訣です。
2. 入力エラーの代表格!ファイルが存在しない場合の対策
COBOLプログラムで最も多いエラーの一つが、読み込もうとしたデータファイルが存在しないというケースです。これを放置すると、プログラムは「無理やり動こうとして転んでしまう」ような状態になります。これを防ぐために、COBOLにはファイルの状態を確認する仕組みが備わっています。
ファイルの状態を数字で教えてくれる変数をファイルステータスと呼びます。この数字が「00」なら成功、「35」ならファイルが見つからない、といった具合です。この数字をチェックすることで、安全に入力処理を進めることができます。まずは、ファイルが開けるかどうかを確認するシンプルなコードを見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. INPUT-CHECK.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO "DATA.TXT"
FILE STATUS IS FS-CODE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FS-CODE PIC X(2).
PROCEDURE DIVISION.
OPEN INPUT IN-FILE.
IF FS-CODE NOT = "00"
DISPLAY "エラー:ファイルが見つかりません。確認してください。"
STOP RUN
END-IF.
CLOSE IN-FILE.
STOP RUN.
3. 出力エラーを防ぐ!ディスクがいっぱいの時のハンドリング
計算結果をファイルに保存する「出力」の際にもエラーは潜んでいます。例えば、保存先のハードディスク(データを貯める箱)がいっぱいだったり、書き込み権限がなかったりする場合です。これを無視して書き続けようとすると、せっかくの計算結果が消えてしまうかもしれません。
出力時も入力と同じく、ファイルステータスを監視することが重要です。特に、大量のデータを扱う運用スクリプトでは、途中で書き込みができなくなった瞬間に処理を中断し、管理者に知らせる必要があります。以下のプログラムは、書き込み時に異常がないかを確認する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. OUTPUT-CHECK.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OUT-FILE ASSIGN TO "RESULT.TXT"
FILE STATUS IS FS-OUT.
DATA DIVISION.
FILE SECTION.
FD OUT-FILE.
01 OUT-REC PIC X(20).
WORKING-STORAGE SECTION.
01 FS-OUT PIC X(2).
PROCEDURE DIVISION.
OPEN OUTPUT OUT-FILE.
IF FS-OUT NOT = "00"
DISPLAY "エラー:書き込み用ファイルが開けません!ステータス:" FS-OUT
STOP RUN
END-IF.
MOVE "SHUKEI KEKKA" TO OUT-REC.
WRITE OUT-REC.
CLOSE OUT-FILE.
STOP RUN.
4. ユーザーの入力ミスを優しく指摘するバリデーション
CLIツールでは、キーボードから数字や名前を入力してもらうことがあります。しかし、人間は必ず打ち間違いをします。数字を入れてほしいところに文字を入れたり、空欄のままボタンを押したりすることもあります。こうした不適切な入力をチェックすることをバリデーションと呼びます。
初心者が作ったプログラムでよくあるのは、間違った入力のせいで計算ができなくなり、画面が固まってしまう現象です。これを防ぐには、入力されたデータが正しい形式かどうかを「IF文」で細かくチェックします。例えば、年齢を入れる場所にマイナスの数字が入っていないか確認するような処理です。これにより、プログラムの信頼性がぐっと高まります。
5. 異常終了を知らせるRETURN-CODEの使い方
プログラムがエラーで終わったとき、ただ画面にメッセージを出すだけでなく、その「失敗した」という事実をコンピューター自身に伝える必要があります。これに使うのがRETURN-CODE(リターンコード)という特別な変数です。
一般的に、正常に終わったときは「0」、何かトラブルがあったときは「9」などの数字をセットして終了します。これにより、このCOBOLプログラムを呼び出した運用スクリプト(PowerShellやシェルスクリプトなど)が、「あ、前の処理が失敗したから、次の処理はやめておこう」と賢く判断できるようになります。連携プレーには欠かせない機能です。
IDENTIFICATION DIVISION.
PROGRAM-ID. RETURN-ERROR.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 IN-DATA PIC 9(3).
PROCEDURE DIVISION.
DISPLAY "数値を入力してください(1-100):".
ACCEPT IN-DATA.
IF IN-DATA < 1 OR IN-DATA > 100
DISPLAY "エラー:範囲外の数値です。"
MOVE 9 TO RETURN-CODE
STOP RUN
END-IF.
DISPLAY "入力された値は正常です。"
MOVE 0 TO RETURN-CODE.
STOP RUN.
6. 無限ループを回避せよ!繰り返し処理の安全策
「データが終わるまで読み込む」という繰り返し処理(ループ)を書くとき、もしデータの終わり(EOF:End Of File)を正しく検知できないと、プログラムは永遠に同じ場所をぐるぐる回り続けてしまいます。これが無限ループです。パソコンが熱くなったり、動かなくなったりする原因になります。
COBOLでは「READ」命令の際に「AT END」という特別な句を使って、データの終わりに到達したときの処理を明示します。ここに「読み込み終了フラグ」を立てる処理を書くことで、安全にループを抜けることができます。初心者の方は、必ず「いつか必ず終わる仕組み」になっているかを確認する癖をつけましょう。
7. エラーログの重要性!後から原因を調査するために
エラーが起きたその瞬間だけでなく、後で「なぜ失敗したのか」を調べることも大切です。そのために、エラーの内容をファイルに書き残しておくことをログ出力と言います。CLIツールを自動で動かしている場合、誰も画面を見ていないので、ログが唯一の手がかりになります。
ログには、エラーが起きた日時、エラーの種類、そして「どのファイルで起きたか」などの情報を記録します。これがあれば、翌朝会社に来てからログファイルを開くだけで、夜中に起きたトラブルの原因を特定できます。完璧なプログラムを作るのは難しいですが、原因がすぐ分かるプログラムを作ることは、初心者でも可能です。
8. ゼロ除算に注意!計算エラーを未然に防ぐ方法
算数の世界で「数字をゼロで割ってはいけない」というルールがあるように、コンピューターもゼロで割り算をしようとすると、パニックを起こして止まってしまいます。これをゼロ除算エラーと呼びます。例えば、売上を客数で割って客単価を出すとき、客数がゼロだとエラーになります。
これを防ぐには、割り算を行う直前に必ず「割る数がゼロではないか」を確認します。COBOLには「ON SIZE ERROR」という、計算結果が桁あふれしたり、異常な計算になったりしたときに実行する便利な命令もあります。これらを組み合わせることで、計算ミスによる強制終了を防ぐことができます。
IDENTIFICATION DIVISION.
PROGRAM-ID. CALC-SAFE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRICE PIC 9(6) VALUE 1000.
01 NINZU PIC 9(3) VALUE 0.
01 KEKKA PIC 9(6).
PROCEDURE DIVISION.
IF NINZU = 0
DISPLAY "エラー:人数がゼロなので計算できません。"
MOVE 9 TO RETURN-CODE
STOP RUN
END-IF.
DIVIDE PRICE BY NINZU GIVING KEKKA
ON SIZE ERROR
DISPLAY "計算エラーが発生しました。"
END-DIVIDE.
DISPLAY "一人当たり: " KEKKA "円".
STOP RUN.
9. 継続的なテストと改善!失敗を恐れない開発
どれだけ気をつけていても、最初は思いもよらない場所でエラーが起きるものです。大切なのは、エラーが起きるたびに「なぜ起きたのか」を考え、それを防ぐコードを少しずつ足していくことです。これを繰り返すことで、あなたの作ったCLIツールはどんどん強く、頼もしいものになっていきます。
パソコン初心者だった方も、エラーハンドリングを意識し始めた時点で、立派なプログラマーの第一歩を踏み出しています。エラーは敵ではなく、プログラムをより良くするためのヒントをくれる先生のような存在です。一つひとつのエラーと丁寧に向き合い、ユーザーに優しい、そして自分自身も安心して運用できるスクリプトを作り上げていきましょう!