COBOLのエラーハンドリングをやさしく解説!ON SIZE ERRORの基本を理解しよう
生徒
「COBOLのプログラムでエラーが起きたときは、どうやって対処するんですか?」
先生
「COBOLでは、エラーが起こったときに特別な処理を行うための仕組みがあります。例えばON SIZE ERRORという構文を使って、安全に処理を続けることができるんです。」
生徒
「それを使うと、プログラムが止まったりしないんですか?」
先生
「そのとおりです。では、COBOLのエラーハンドリングの基本を一緒に学んでいきましょう!」
1. エラーハンドリングとは?
エラーハンドリングとは、プログラムを実行しているときに予期しない問題(エラー)が発生した場合、それに適切に対応するための処理のことです。
たとえば、100桁の数字を扱える場所に、101桁の数字を入れようとした場合、プログラムがエラーになります。このようなとき、何も対策をしていないと、プログラムは止まってしまいます。
しかし、COBOLではエラーが起きたときに特定の処理を行う方法が用意されており、そのひとつがON SIZE ERRORという構文です。
2. ON SIZE ERRORとは?
ON SIZE ERRORは、主にCOMPUTE(計算)やADD(加算)などの算術処理で使われます。計算の結果が、変数に収まらないサイズになってしまったときに実行される処理を指定できます。
例えるなら、「コップに水を入れていたら、あふれそうになったときにアラームを鳴らして水を止める」ようなイメージです。
これにより、予期しない計算結果による不具合を防ぎ、エラーが起きたことをユーザーに知らせたり、安全な代替処理を行ったりできます。
3. 基本的なON SIZE ERRORの書き方
まずはCOMPUTE文でON SIZE ERRORを使う基本的な書き方を見てみましょう。
WORKING-STORAGE SECTION.
01 NUM1 PIC 9(3) VALUE 999.
01 NUM2 PIC 9(3) VALUE 2.
01 RESULT PIC 9(3).
PROCEDURE DIVISION.
COMPUTE RESULT = NUM1 * NUM2
ON SIZE ERROR
DISPLAY "エラー発生:結果が大きすぎます。"
NOT ON SIZE ERROR
DISPLAY "計算結果:" RESULT
END-COMPUTE.
STOP RUN.
この例では、999 × 2 = 1998となり、RESULTには入りきりません(3桁まで)。そのため、ON SIZE ERRORが実行されて、エラーメッセージが表示されます。
実行結果:
エラー発生:結果が大きすぎます。
4. ON SIZE ERRORを使わないとどうなる?
ON SIZE ERRORを使わないと、エラーが起きたときにRESULTの中身が正しくないまま処理が続いてしまう可能性があります。これはとても危険です。
たとえば、銀行の口座残高を計算しているときに、正しくない金額が表示されたら大問題です。ですから、エラーハンドリングはCOBOLプログラムの安全性を高めるうえでとても大切なのです。
5. ADD文でもON SIZE ERRORは使える
ADD(足し算)でもON SIZE ERRORを使えます。以下の例をご覧ください。
WORKING-STORAGE SECTION.
01 A PIC 9(3) VALUE 900.
01 B PIC 9(3) VALUE 200.
01 TOTAL PIC 9(3).
PROCEDURE DIVISION.
ADD A TO B GIVING TOTAL
ON SIZE ERROR
DISPLAY "合計が大きすぎます。"
NOT ON SIZE ERROR
DISPLAY "合計は:" TOTAL
END-ADD.
STOP RUN.
900 + 200 = 1100で、3桁に収まりません。なので、エラーメッセージが表示されます。
合計が大きすぎます。
6. ON SIZE ERRORとNOT ON SIZE ERRORの使い分け
ON SIZE ERRORは「エラーが起きたとき」の処理、NOT ON SIZE ERRORは「エラーが起きなかったとき」の処理を記述します。
両方セットで書いておくと、安全かつ柔軟にプログラムの流れをコントロールできます。
7. 実用的な使い方の工夫
実際の業務プログラムでは、エラーが発生した場合、ログに記録したり、データベースに保存したりするケースもあります。最初はDISPLAYで画面に表示するだけでも十分ですが、ゆくゆくはエラー内容を別の変数に格納して、あとでまとめて出力するような仕組みに発展させることも可能です。
また、エラーを発生させないために、変数のサイズを適切に設計することも大切です。入力チェックや最大値チェックと組み合わせることで、より堅牢なプログラムが作れます。
8. ON SIZE ERRORを使うときの注意点
- ON SIZE ERRORは数値演算専用であり、ファイル処理や文字列操作では使えません。
- 必ず変数の桁数を意識してプログラムを書くようにしましょう。
END-COMPUTEやEND-ADDなどの終端を忘れずに記述することが重要です。
まとめ
COBOLの世界では、数値演算を行う場面がとても多くあります。会計処理や在庫管理、売上集計など、日々の業務を支える処理は数字が中心になります。だからこそ、計算が失敗したときにプログラムが止まったり、間違った値を扱ったまま処理が先へと進んでしまうと、大きな問題につながる恐れがあります。そこで役に立つのが、今回学んできたON SIZE ERRORです。この構文を使うことで、計算の結果が変数に収まりきらないときに専用の処理を流せるようになり、プログラムの安全性がぐっと高まります。
実際の業務でも、桁あふれは珍しい話ではありません。「ちょっと数字が大きくなっただけ」と見過ごしてしまうと、それが報告書や転送データに反映され、後から原因調査に時間がかかってしまうケースもあります。とくにCOBOLは大量のデータを扱うので、正確な値を維持するためにも、エラーハンドリングは欠かせません。さらに、NOT ON SIZE ERRORと組み合わせることで、正常時の処理と異常時の処理を明確に分けることができ、読みやすく手当てしやすいコードになっていきます。
初めは、DISPLAYでエラーメッセージを出すだけでも十分です。ですが、現場では履歴を記録するためにログを残したり、別の領域にエラー内容を退避して異常件数を集計したりするやり方も一般的です。さらに、サイズオーバーの原因を突き止めるために、入力データをチェックする処理と組み合わせることもあります。例えば、あらかじめ変数よりも大きい値が入っていないか検証したり、桁数の上限を超えた場合は別ルートの処理に切り替えたりといった応用もできます。こうした手法を取り入れるほど、COBOLのプログラムはより堅牢で信頼性の高いものになっていきます。
また、ON SIZE ERRORは数値演算専用の仕組みであることも大切なポイントです。文字列の操作やファイルアクセスでは別のエラー対策が必要です。だからこそ、どの場面で使えるのかをしっかり理解しておくことが、次のステップにつながります。特に会計系の処理では、桁の設計そのものが重要になることが多く、単純に大きい桁の変数にすれば良いという話でもありません。ストレージ容量や処理時間を考え、必要な桁数を設計する力も求められます。
もし、計算が正常に終わったときと、エラーが出たときの動きを比べたい場合、次のようなプログラムを書いて試してみると理解が深まります。
WORKING-STORAGE SECTION.
01 X PIC 9(3) VALUE 500.
01 Y PIC 9(3) VALUE 300.
01 ANSWER PIC 9(3).
PROCEDURE DIVISION.
COMPUTE ANSWER = X + Y
ON SIZE ERROR
DISPLAY "計算が範囲をこえました。"
NOT ON SIZE ERROR
DISPLAY "計算結果は:" ANSWER
END-COMPUTE.
DISPLAY "処理が完了しました。".
STOP RUN.
このように、結果が桁に収まらないときにはON SIZE ERRORが動き、正常であればそのまま値を表示します。動きを確かめながら、変数の大きさ、計算の流れ、エラーが発生した場合の処理を確認できるため、初心者でも安心して理解を深めることができます。
さらに応用として、エラーが発生した値を別の変数に格納し、後でまとめて出力したり、条件に応じて違う場所へ保存したりすることも可能です。プログラムは、ただ動けばいいというものではありません。予期しないデータが流れ込んでも、正確な結果を保証できることが求められます。COBOLで安全性の高いシステムが作れる理由のひとつは、こうした細やかなエラーハンドリング機能にあります。
初めてCOBOLに触れた人でも、ON SIZE ERRORは非常に分かりやすい構文です。どんな場面で使えるのか、そして、どのようにプログラムの信頼性を高めているのかを理解しておくと、これからの学習がぐっと楽になります。現場では当たり前のように使われている仕組みですが、その一つひとつには理由があり、役割があります。数字を扱うからこそ、ミスが起きたときに安全に処理できる手段を知っておくことが大切です。
エラーハンドリングは、単なる追加処理ではありません。システムを正しく守り、利用者にとって安心できる結果を届けるための仕組みです。今回の内容をしっかり理解しておけば、さらに幅広いCOBOLの世界へ進む準備が整ったと言えるでしょう。
生徒
「エラーが起きてもプログラムが止まらないようにできるって分かって安心しました。」
先生
「大切なのは、エラーが起きたことを気づけること。そして安全に処理を続けられることですね。」
生徒
「NOT ON SIZE ERRORを使えば、成功したときの処理も書けるんですね。」
先生
「そのとおりです。両方を書くことで、異常系と正常系が分かれて、読みやすいプログラムになります。」
生徒
「実務でも使われている仕組みなら、しっかり覚えておきたいです!」