COBOLのON SIZE ERROR句を徹底解説!初心者でもわかるエラーハンドリングの基本
生徒
「先生、COBOLで計算してたら、たまにおかしな結果が出るんです。これってエラーですか?」
先生
「いい質問ですね。それはもしかすると『サイズエラー』というものかもしれません。COBOLでは、数値が桁あふれしたときにON SIZE ERROR句で対処できるんですよ。」
生徒
「桁あふれ?どういうことですか?」
先生
「では、今日はその『ON SIZE ERROR句』を使ったエラーハンドリングの方法を、やさしく説明していきましょう!」
1. ON SIZE ERROR句とは?
ON SIZE ERROR句(オン・サイズ・エラー句)は、COBOLで計算を行う際に、結果が定義された桁数を超えてしまったとき(いわゆる桁あふれ)に実行される特別な処理を指定するための機能です。
たとえば、PIC 9(3)という定義は「3桁の整数」という意味ですが、そこに「999 + 5」を代入すると「1004」となり、4桁になるため格納できません。こういったときに、COBOLは自動でエラーを出す代わりに、ON SIZE ERRORで指定した処理を実行します。
プログラムで安全に計算を行うためには、このON SIZE ERRORを正しく使うことがとても大切です。
2. 基本の書き方
ON SIZE ERROR句は、ADD(足し算)、SUBTRACT(引き算)、MULTIPLY(掛け算)、DIVIDE(割り算)、COMPUTE(複合計算)などの算術文(さんじゅつぶん)と一緒に使います。
ADD A TO B
ON SIZE ERROR
DISPLAY "サイズエラーが発生しました。"
NOT ON SIZE ERROR
DISPLAY "計算が正常に行われました。"
END-ADD.
ポイント:
ON SIZE ERRORの中には「エラーが起きたときの処理」を書きます。NOT ON SIZE ERRORの中には「正常に処理できたときの処理」を書きます。- 最後に必ず
END-ADDなど、対応する命令を閉じます。
3. 実際のサンプルコード
次のプログラムは、あえて桁あふれが起きるようにして、ON SIZE ERRORの動きを確認する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SIZE-ERROR-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(3) VALUE 999.
01 B PIC 9(3) VALUE 5.
01 RESULT PIC 9(3) VALUE 0.
PROCEDURE DIVISION.
ADD A TO B GIVING RESULT
ON SIZE ERROR
DISPLAY "エラー発生:計算結果が桁あふれしました。"
NOT ON SIZE ERROR
DISPLAY "計算成功:結果 = " RESULT
END-ADD.
STOP RUN.
このプログラムを実行すると、結果は次のようになります。
エラー発生:計算結果が桁あふれしました。
999 + 5 = 1004 ですが、RESULTは3桁しか入らないためエラーになります。COBOLはこのときON SIZE ERRORの部分を実行します。
4. NOT ON SIZE ERRORで安全な処理を行う
NOT ON SIZE ERRORを使うと、「桁あふれしなかった場合」の処理も一緒に書けます。これにより、エラーが発生しても発生しなくても、プログラムの動作をきちんとコントロールできます。
COMPUTE RESULT = A + B
ON SIZE ERROR
DISPLAY "結果がオーバーフローしました。"
NOT ON SIZE ERROR
DISPLAY "正常に計算できました。結果は:" RESULT
END-COMPUTE.
このようにすることで、エラー時と正常時の処理を明確に分けることができます。業務システムでは、このような安全な設計がとても重要です。
5. ON SIZE ERRORが起きる原因
初心者の方が混乱しやすいのは、「なぜサイズエラーが起きるのか?」という点です。原因は主に次の3つです。
- 変数の桁数が足りない
たとえば、
PIC 9(3)に4桁の数値を入れようとした場合、エラーになります。 - 符号(プラス・マイナス)の扱い
PIC S9(3)(符号付き)に大きな正数を入れると、許容範囲を超えてしまうことがあります。 - 小数点位置の不一致
小数点を持つ変数(例:
9V99)と整数を混ぜて計算すると、桁ズレが起きてサイズエラーにつながる場合があります。
6. 実務での活用例:安全な金額計算
銀行や販売管理などの業務システムでは、金額計算でサイズエラーを防ぐことが特に重要です。たとえば、1億円を超える計算を3桁の変数で扱うと当然エラーになります。次のように、ON SIZE ERRORを使って安全に処理できます。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAFE-CALC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TOTAL-AMOUNT PIC 9(6) VALUE 999999.
01 ADDITION PIC 9(4) VALUE 5000.
01 RESULT-AMOUNT PIC 9(6) VALUE 0.
PROCEDURE DIVISION.
ADD TOTAL-AMOUNT TO ADDITION GIVING RESULT-AMOUNT
ON SIZE ERROR
DISPLAY "金額が上限を超えました。再計算してください。"
NOT ON SIZE ERROR
DISPLAY "正常計算:合計金額は " RESULT-AMOUNT " 円です。"
END-ADD.
STOP RUN.
このようにしておくと、エラーが起きてもプログラムが途中で止まらず、ユーザーにメッセージを表示することができます。
7. 注意点とベストプラクティス
ON SIZE ERRORを使うときは、次の点に気をつけましょう。
- 結果を代入する変数の桁数を常に確認する。
- 重要な計算には
ON SIZE ERRORを必ずつけて、安全性を高める。 - 必要に応じて
NOT ON SIZE ERRORも使い、処理の流れを明確にする。
これらを意識することで、COBOLプログラムの信頼性(しんらいせい)を大きく向上させることができます。
まとめ
COBOLのON SIZE ERROR句について学んできた内容を振り返ると、桁あふれによる予期せぬエラーを防ぐための仕組みがいかに重要であるかがよくわかります。特に業務システムでは、金額計算や集計処理など、数値の上限を超える可能性がある場面が多く、そのたびにプログラムが異常終了していては安定した運用はできません。そうした問題を避けるために、COBOLはON SIZE ERRORという非常に明確で扱いやすいエラーハンドリングの方法を提供しています。
さらに、ON SIZE ERROR句は単なるエラー検知ではなく、エラー時にどのような処理を行うかを細かく制御できるため、安全性の高いロジック設計に欠かせない要素です。エラーが起きた場合でもユーザーに適切なメッセージを表示したり、ログを記録したり、別の処理へ切り替えたりと柔軟に対応できます。こうした堅牢な設計は、金融・物流・販売管理といったCOBOLが活躍する分野で長く使われ続けてきた理由のひとつでもあります。
また、ON SIZE ERROR句の動きは、実際のプログラムを使って確認することで理解が深まります。次に示すサンプルでは、計算結果が変数に収まりきらない場合にエラー処理を行い、正常時にはその結果を丁寧に表示する流れを復習できます。
サイズエラー確認サンプルコード
IDENTIFICATION DIVISION.
PROGRAM-ID. SIZE-ERROR-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 BASE-AMOUNT PIC 9(3) VALUE 500.
01 EXTRA-AMOUNT PIC 9(3) VALUE 700.
01 TOTAL-AMOUNT PIC 9(3) VALUE 0.
PROCEDURE DIVISION.
ADD BASE-AMOUNT TO EXTRA-AMOUNT GIVING TOTAL-AMOUNT
ON SIZE ERROR
DISPLAY "計算結果が桁あふれしました。入力値を確認してください。"
NOT ON SIZE ERROR
DISPLAY "正常結果:" TOTAL-AMOUNT " が計算されました。"
END-ADD.
STOP RUN.
このコードでは、500 + 700 = 1200 という4桁の結果が発生するため、PIC 9(3)のTOTAL-AMOUNTには収まりません。そのため、ON SIZE ERROR句が呼び出され、ユーザーへ警告を表示します。実際の開発でも同じように、計算結果が意図した桁数を超える可能性がある場合は、必ずON SIZE ERROR句を使用して安全性を確保する必要があります。
また、桁数の定義が適切かどうかを事前に確認する習慣をつけることで、エラー発生のリスクは大幅に低減します。たとえば「最大でどれくらいの値が入るのか」「負の値を扱う可能性はあるか」「小数点の有無は適切か」など、変数の仕様を細かく把握することは、信頼性の高いCOBOLプログラムを作る上で欠かせない視点です。
さらに、NOT ON SIZE ERROR句を併用して正常時の処理を明確にしておくと、プログラムの流れが理解しやすくなり、保守の際も非常に便利です。エラー時と正常時の処理を分岐させて書くことは読みやすさの点でも優れており、現場のCOBOLプログラマがよく実践している書き方でもあります。
実務では、金額計算、在庫計算、ポイント管理など「上限値を超える可能性」がある処理は非常に多いため、ON SIZE ERROR句を適切に組み込めるかどうかがプログラム品質を大きく左右します。初心者のうちは「とにかくつけておく」意識で構いませんが、慣れてきたら「どこに必要で、どこは不要か」を見極める判断力も身につけていきましょう。
生徒
「サイズエラーってただの計算ミスだと思っていましたが、変数の桁数が原因になることも多いんですね!」
先生
「そうなんです。COBOLでは変数定義がとても重要で、桁数ひとつで正しく動かなくなることがあります。だからこそON SIZE ERROR句が役に立つんですよ。」
生徒
「エラー時と正常時の処理を分けて書けるのも便利ですね!処理の流れが分かりやすくなりました。」
先生
「その通りです。特に業務では安全な計算が求められるので、ON SIZE ERROR句を正しく使えるかどうかがとても大切なんです。」
生徒
「これからは計算する変数の桁数も意識して、ON SIZE ERROR句をちゃんと使うようにします!」
先生
「良い心がけですね。安全で信頼性の高いCOBOLプログラムを作る第一歩ですよ。」