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プログラムの信頼性(しんらいせい)を大きく向上させることができます。