カテゴリ: COBOL 更新日: 2025/12/08

COBOLのON SIZE ERROR句を徹底解説!初心者でもわかるエラーハンドリングの基本

ON SIZE ERROR句を活用したエラーハンドリング
ON SIZE ERROR句を活用したエラーハンドリング

先生と生徒の会話形式で理解しよう

生徒

「先生、COBOLで計算してたら、たまにおかしな結果が出るんです。これってエラーですか?」

先生

「いい質問ですね。それはもしかすると『サイズエラー』というものかもしれません。COBOLでは、数値が桁あふれしたときにON SIZE ERROR句で対処できるんですよ。」

生徒

「桁あふれ?どういうことですか?」

先生

「では、今日はその『ON SIZE ERROR句』を使ったエラーハンドリングの方法を、やさしく説明していきましょう!」

1. ON SIZE ERROR句とは?

1. 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. 基本の書き方

2. 基本の書き方
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. 実際のサンプルコード

3. 実際のサンプルコード
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で安全な処理を行う

4. NOT 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が起きる原因

5. ON SIZE ERRORが起きる原因
5. ON SIZE ERRORが起きる原因

初心者の方が混乱しやすいのは、「なぜサイズエラーが起きるのか?」という点です。原因は主に次の3つです。

  1. 変数の桁数が足りない たとえば、PIC 9(3)に4桁の数値を入れようとした場合、エラーになります。
  2. 符号(プラス・マイナス)の扱い PIC S9(3)(符号付き)に大きな正数を入れると、許容範囲を超えてしまうことがあります。
  3. 小数点位置の不一致 小数点を持つ変数(例:9V99)と整数を混ぜて計算すると、桁ズレが起きてサイズエラーにつながる場合があります。

6. 実務での活用例:安全な金額計算

6. 実務での活用例:安全な金額計算
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. 注意点とベストプラクティス

7. 注意点とベストプラクティス
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プログラムを作る第一歩ですよ。」

カテゴリの一覧へ
新着記事
New1
C#
C#のデフォルト引数と名前付き引数の使い方を解説!初心者でも安心のやさしい入門
New2
C#
C#のオブジェクト初期化子を完全ガイド!初心者でもわかる便利な使い方
New3
COBOL
COBOLの帳票出力と編集を完全マスター!条件付き表示で分かりやすい書類を作る方法
New4
COBOL
COBOLの帳票出力を完全攻略!数値項目のカンマ・小数点編集例を徹底解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.2
Java&Spring記事人気No2
C#
C#でJSONファイルを読み書きする方法(JsonSerializer・Newtonsoft.Json)
No.3
Java&Spring記事人気No3
C#
C#のLINQクエリ構文の書き方と基本操作をマスターしよう
No.4
Java&Spring記事人気No4
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.5
Java&Spring記事人気No5
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.6
Java&Spring記事人気No6
C#
C#のLINQ(リンク)とは?基本概念とデータ操作を初心者向けに徹底解説!
No.7
Java&Spring記事人気No7
C#
C#の非同期処理とUIスレッドをマスター!WPF/WinFormsでアプリが止まる問題を解決
No.8
Java&Spring記事人気No8
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法