21.1.3 共通例外処理の使用例

プログラムに共通例外処理を追加する例を,次に示します。

この例では,ACCEPT文に内部浮動小数点項目を指定しているため,-NumAcceptコンパイラオプションの指定が必要です。

<主プログラム:SAMPLE1.CBL(変更前)>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE1.
       :
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 PARAM USAGE COMP-1.
       :
      PROCEDURE DIVISION.

        DISPLAY '値を入力してください '.
        ACCEPT PARAM.
        CALL 'SAMPLE2' USING PARAM.

      END PROGRAM SAMPLE1.

<副プログラム:SAMPLE2.CBL(変更前)>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE2.
         :
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 ANS USAGE COMP-1.
      LINKAGE SECTION.
      01 PARAM USAGE COMP-1.
         :
      PROCEDURE DIVISION USING PARAM.

          COMPUTE ANS = FUNCTION ACOS ( PARAM ).
          DISPLAY 'ANSWER  =' ANS.

      END PROGRAM SAMPLE2.

(変更前のプログラムの説明)
主プログラムSAMPLE1で入力された値について,副プログラムSAMPLE2内でACOS関数を使用して逆余弦の近似値を求めるプログラムです。入力した値が不正な場合,実行時エラーメッセージが出力され,プログラムが異常終了します。

不正な値が入力された場合に共通例外処理を使用して例外を処理するために,上記のプログラムを次のように修正します。

  1. 組み込み関数の引数エラーについて,例外チェックを有効にする。
    組み込み関数の引数エラーについて例外を引き起こすには,翻訳指令のTURN指令を指定して,対応する例外名EC-ARGUMENT-FUNCTIONのチェックをONにします。

    >>TURN EC-ARGUMENT-FUNCTION CHECKING ON

    TURN指令については,「21.3 TURN指令」を参照してください。
  2. 宣言手続きを記述する。
    共通例外処理として,EC-ARGUMENT-FUNCTION例外発生時の宣言手続きを記述します。宣言手続きは,USE文を使用して次のように記述します。

    DECLARATIVES.
    USE-EC-ARGUMENT SECTION.
     USE AFTER EXCEPTION CONDITION EC-ARGUMENT-FUNCTION.
       DISPLAY '入力値不正!!'.
       RESUME AT ERR-RETRY.
    END DECLARATIVES.

    この例題では,主プログラムSAMPLE1で共通例外処理するため,SAMPLE1に宣言手続きを記述します。宣言手続きについては,「21.4 共通例外の宣言手続き」を参照してください。
  3. 自動伝播を有効にする。
    呼び出し先プログラム(SAMPLE2)で引き起こした例外を,呼び出し元プログラム(SAMPLE1)に自動伝播するためには,PROPAGATE指令をONにします。

    >>PROPAGATE ON

    伝播については,「21.5 例外の伝播」を参照してください。

上記の例外処理を追加したサンプルプログラムを,次に示します。太字の個所が,追加部分です。

<主プログラム:SAMPLE1.CBL(変更後)>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE1.
          :
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 PARAM USAGE COMP-1.
          :
      PROCEDURE DIVISION.
      DECLARATIVES. *> 3.
        USE-EC-ARGUMENT SECTION.
          USE AFTER EXCEPTION CONDITION
                              EC-ARGUMENT-FUNCTION.
          DISPLAY '入力値不正!!'.
          RESUME AT ERR-RETRY. *> 4.
      END DECLARATIVES.

      ERR-RETRY.
        DISPLAY '値を入力してください '.
        ACCEPT PARAM.
      >>TURN EC-ARGUMENT-FUNCTION CHECKING ON
        CALL 'SAMPLE2' USING PARAM. *> 2.

      END PROGRAM SAMPLE1.

<副プログラム:SAMPLE2.CBL(変更後)>

      >>PROPAGATE ON
      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE2.
       :
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 ANS USAGE COMP-1.
      LINKAGE SECTION.
      01 PARAM USAGE COMP-1.
       :
      PROCEDURE DIVISION USING PARAM.

      >>TURN EC-ARGUMENT-FUNCTION CHECKING ON
          COMPUTE ANS = FUNCTION ACOS ( PARAM ). *> 1.
          DISPLAY 'ANSWER  =' ANS.

      END PROGRAM SAMPLE2.

(変更後のプログラムの説明)
このプログラムを実行すると,SAMPLE2のCOMPUTE文(1.)で組み込み関数ACOSの引数エラーが発生した場合,次のように例外宣言処理が実行されます。
  1. SAMPLE2のCOMPUTE文で組み込み関数ACOSの引数エラーが発生します。
  2. 組み込み関数の引数エラーに対応する例外名EC-ARGUMENT-FUNCTIONのTURN指令のチェックがONのため,例外が引き起こされます。このとき,PROPAGATE指令がONになっているので,SAMPLE1のCALL文に例外が伝播します。
  3. 例外宣言手続きが実行されます。
  4. RESUME文によって,例外宣言手続きからERR-RETRY節に制御が戻ります。