【COBOL学習|豆知識】COBOLの計算処理における安全装置「ON SIZE ERROR」を使いこなそう

1. 導入

COBOLでの数値計算において、最も恐ろしいバグの一つが「桁あふれ」です。計算結果が受取り側のデータ項目に収まりきらない場合、システムが異常終了したり、最悪の場合は誤った数値のまま処理が進んでしまうことがあります。これを防ぐための強力な武器が「ON SIZE ERROR」句です。本記事では、この句を正しく活用し、堅牢なプログラムを作成する方法を解説します。

2. 基礎知識

COBOLの数値演算(ADD, SUBTRACT, MULTIPLY, DIVIDE, COMPUTEなど)では、計算結果が「受取り側項目(演算結果を代入する変数)」の定義桁数を超えると、上位桁が切り捨てられたり、予期せぬ挙動を示したりします。
ON SIZE ERROR句は、この「桁あふれ(SIZE ERROR)」が発生した瞬間に、プログラムが異常終了するのを防ぎ、代わりに指定した命令(ログ出力やエラーフラグのセットなど)を自動的に実行させるための例外処理機構です。

3. 実装/解決策

ON SIZE ERRORは、計算命令の末尾に記述します。この句が実行されると、受取り側項目には計算前の値が維持されるか、あるいは不定値が入ります。そのため、エラーが発生した際には、該当する計算結果を使わずに、エラーハンドリングルーチンへ遷移させるのが定石です。

4. サンプルプログラム

以下に、計算結果が桁あふれを起こす可能性を考慮したサンプルを示します。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SIZE-ERROR-SAMPLE.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-VAL1        PIC 9(03) VALUE 900.
       01 WS-VAL2        PIC 9(03) VALUE 200.
       01 WS-RESULT      PIC 9(03). > 最大3桁までしか入らない

       PROCEDURE DIVISION.
       MAIN-LOGIC.
  • 900 + 200 = 1100 となり、WS-RESULT(3桁)では収まらない
ADD WS-VAL1 TO WS-VAL2 GIVING WS-RESULT ON SIZE ERROR DISPLAY "★エラー: 計算結果が桁あふれしました" DISPLAY "計算値は範囲外です。処理を中断または代替処理へ" NOT ON SIZE ERROR DISPLAY "計算成功: " WS-RESULT END-ADD. STOP RUN.

5. 応用・注意点

現場での実務において、以下の点に注意してください。

1. COMPUTE文での使用
COMPUTE文でもON SIZE ERRORは非常に有効です。複雑な計算式を書く際は、必ずこの句を添えるのが「安全なCOBOL」を書くための鉄則です。

2. ゼロ除算との併用
実は、DIVIDE文において「0で割った場合」もSIZE ERRORとして扱われます。そのため、ゼロ除算チェックと桁あふれチェックを同時に行うことが可能です。

3. プログラムの可読性
ON SIZE ERRORを記述すると、ロジックが分岐するためコードが長くなりがちです。エラー時の処理を「エラー処理用パラグラフ」として独立させ、PERFORM文で呼び出すように設計すると、メインロジックがすっきりと保たれます。

数値計算における「もしも」を想定し、ON SIZE ERRORでしっかりとガードを固めることが、ベテランエンジニアへの第一歩です。ぜひ、既存のプログラムを見直してみてください。

コメント

タイトルとURLをコピーしました