1. なぜ「NOT ON SIZE ERROR」が重要なのか
COBOLでの開発現場において、数値計算は最も基本的でありながら、最も注意を払うべき箇所です。計算結果が定義した桁数を超えてしまう「桁あふれ(サイズエラー)」が発生した際、プログラムが異常終了したり、意図しない値で処理が進んだりすることは避けなければなりません。
NOT ON SIZE ERROR 句は、計算が「正常に完了したこと」を保証された場合にのみ処理を実行する仕組みです。エラー時(ON SIZE ERROR)の処理と、正常時(NOT ON SIZE ERROR)の処理を明確に分けることで、プログラムの可読性と安全性を格段に高めることができます。
2. 基礎知識:サイズエラーとは?
COBOLでは、変数(データ項目)に対してあらかじめ「何桁まで入るか」をPIC句で定義します。例えば「PIC 9(3)」であれば、格納できるのは000から999までです。
もし計算結果が1000になった場合、変数には入りきらないため「サイズエラー」が発生します。この時、プログラムがエラー処理を定義していないと、予期せぬ挙動を引き起こすリスクがあります。NOT ON SIZE ERROR は、「計算が成功したときだけ、この続きの処理を行ってください」とコンパイラに指示する、守りのための構文なのです。
3. 実装の考え方
この句は、COMPUTE文などの算術命令の直後に記述します。
構造化プログラミングの原則として、「正常系」と「異常系」のロジックを分離しておくことは非常に重要です。NOT ON SIZE ERRORを使用することで、計算が成功したという前提条件をコード上で明示でき、後からプログラムを修正する際にも「どこで正常な計算結果が保証されているか」がひと目で分かるようになります。
4. サンプルプログラム
以下は、2つの数値を足し合わせ、結果が正常な場合のみメッセージを表示するシンプルな例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-SIZE-ERROR.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VAL-A PIC 9(3) VALUE 500.
01 VAL-B PIC 9(3) VALUE 600.
01 RESULT PIC 9(3).
PROCEDURE DIVISION.
MAIN-LOGIC.
- 計算を行い、サイズエラーが発生しなかった場合のみ処理を実行する
COMPUTE RESULT = VAL-A + VAL-B
NOT ON SIZE ERROR
DISPLAY “計算成功: 結果は ” RESULT
ON SIZE ERROR
DISPLAY “計算エラー: 桁あふれが発生しました”
END-COMPUTE.
STOP RUN.
5. 応用と注意点
現場で役立つポイントをいくつかお伝えします。
・END-COMPUTEを忘れない:最新のCOBOLでは範囲を明示する「END-〇〇」の記述が推奨されます。これにより、どの命令に対するNOT ON SIZE ERRORなのかが明確になり、修正時のミスが減ります。
・計算結果の変数のサイズ:計算の受け皿となる変数の桁数は、入力データよりも十分に大きく確保するのが鉄則です。
・ゼロ除算の回避:DIVIDE命令などでもサイズエラーは発生します。計算を行う前には、除数がゼロでないかチェックするロジックを組み合わせると、より堅牢なプログラムになります。
ベテランの視点から言えば、この句を使いこなせるかどうかで、プログラムの「品質」が大きく変わります。ぜひ、日々のコーディングで積極的に取り入れてみてください。

コメント