21.5.2 EXIT文,GOBACK文のRAISING指定による例外の伝播

宣言手続き内で,GOBACK文またはEXIT文のRAISING指定に伝播する例外を指定すると,指定した例外を呼び出し元のプログラムに伝播できます。RAISING指定には,例外名,オブジェクト参照一意名,またはLAST指定します。

RAISING指定については,「COBOL2002 言語 標準仕様編 10.8.20 EXIT文」を参照してください。

EXIT PROGRAM文のRAISING指定を使用した例外の伝播の例を,次に示します。

<主プログラム:SAMPLE1.CBL>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE1.
         :
      PROCEDURE DIVISION.
      DECLARATIVES.
      ERROR-HANDLER SECTION.
        USE AFTER EXCEPTION CONDITION EC-BOUND-SUBSCRIPT. *> 3.
          :
      END DECLARATIVES.

      >>TURN EC-BOUND-SUBSCRIPT CHECKING ON
        CALL 'SAMPLE2'. *> 1.

      END PROGRAM SAMPLE1.

<副プログラム:SAMPLE2.CBL>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE2.
        :
      PROCEDURE DIVISION.

          EXIT PROGRAM RAISING EXCEPTION EC-BOUND-SUBSCRIPT. *> 2.

      END PROGRAM SAMPLE2.

  1. プログラム「SAMPLE1」中のCALL文で,プログラム「SAMPLE2」を呼び出します。
  2. プログラム「SAMPLE2」中のEXIT PROGRAM文のRAISING指定に,伝播させる例外名EC-BOUND-SUBSCRIPTが指定されているため,呼び出し元に例外が伝播します。
  3. 例外の伝播によってCALL文で例外が検出され,例外が引き起こされます。これによって,例外名EC-BOUND-SUBSCRIPTを指定したUSE手続きへ制御が移ります。
<この項の構成>
(1) RAISING LAST指定
(2) 手続き部見出しのRAISING指定
(3) RAISING指定による例外オブジェクトの伝播

(1) RAISING LAST指定

EXIT文またはGOBACK文のRAISING指定にLASTを指定すると,実行単位で最後に引き起こされた例外を伝播できます。RAISING LAST指定は,宣言手続きの実行中だけで使用できます。

なお,何も例外が引き起こされていない状態では,RAISING LAST指定は無視されます。

RAISING LAST指定の例を,次に示します。

<主プログラム:SAMPLE1.CBL>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE1.

      PROCEDURE DIVISION.
      DECLARATIVES.
      EXCEPTION-HANDLER SECTION.
          USE AFTER EXCEPTION CONDITION EC-SIZE-ZERO-DIVIDE. *> 4.
          DISPLAY FUNCTION EXCEPTION-STATUS.
      END DECLARATIVES.
      >>TURN EC-SIZE-ZERO-DIVIDE CHECKING ON
          CALL 'SAMPLE2'. *> 1.
          STOP RUN.
      END PROGRAM SAMPLE1.

<副プログラム:SAMPLE2.CBL>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE2.
             :
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 A-REC PIC S9(9) USAGE COMP VALUE 0.
      01 B-REC PIC S9(9) USAGE COMP VALUE 0.
      01 C-REC PIC S9(9) USAGE COMP VALUE 0.
             :
      PROCEDURE DIVISION.
      DECLARATIVES.
      EXCEPTION-HANDLER SECTION.
          USE AFTER EXCEPTION CONDITION EC-SIZE-ZERO-DIVIDE.
          EXIT PROGRAM RAISING LAST EXCEPTION. *> 3.
      END DECLARATIVES.
      >>TURN EC-SIZE-ZERO-DIVIDE CHECKING ON
          COMPUTE A-REC = B-REC / C-REC. *> 2.
      END PROGRAM SAMPLE2.

  1. プログラム「SAMPLE1」中のCALL文で,プログラム「SAMPLE2」を呼び出します。
  2. プログラム「SAMPLE2」中のCOMPUTE文で,例外EC-SIZE-ZERO-DIVIDEが引き起こされ,例外宣言手続きが実行されます。
  3. EXIT PROGRAM文のRAISING LAST指定によって,最後に引き起こされた例外が呼び出し元のプログラムに伝播します。
  4. 例外の伝播によってCALL文で例外が検出され,例外が引き起こされます。これによって,例外名EC-SIZE-ZERO-DIVIDEを指定したUSE手続きへ制御が移ります。

(2) 手続き部見出しのRAISING指定

EXIT文またはGOBACK文のRAISING指定を使って,利用者定義例外,または例外オブジェクトを伝播する場合,手続き部見出しのRAISING指定に,利用者定義例外名,またはオブジェクトのクラス名もしくはインタフェース名を指定する必要があります。指定していない場合,RAISINGに例外名またはオブジェクト参照データを指定したときはコンパイルエラーとなり,RAISING LAST指定のときは例外名EC-RAISING-NOT-SPECIFIEDまたはEC-OO-EXCEPTIONが伝播されます。

手続き部見出しのRAISING指定の例を,次に示します。

<主プログラム:SAMPLE1.CBL>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE1.

      PROCEDURE DIVISION.
      DECLARATIVES.
      EXCEPTION-HANDLER SECTION.
          USE AFTER EXCEPTION CONDITION EC-USER-XXX.
          DISPLAY FUNCTION EXCEPTION-STATUS.
      END DECLARATIVES.
      >>TURN EC-USER-XXX CHECKING ON
          CALL 'SAMPLE2'.
          STOP RUN.
      END PROGRAM SAMPLE1.

<副プログラム:SAMPLE2.CBL>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE2.
             :
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 A-REC PIC S9(9) USAGE COMP VALUE 0.
      01 B-REC PIC S9(9) USAGE COMP VALUE 0.
      01 C-REC PIC S9(9) USAGE COMP VALUE 0.
             :
      PROCEDURE DIVISION RAISING EC-USER-XXX.
      DECLARATIVES.
      ERROR-HANDLER SECTION.
        USE AFTER EXCEPTION CONDITION EC-SIZE-ZERO-DIVIDE.
          EXIT PROGRAM RAISING EXCEPTION EC-USER-XXX
      END DECLARATIVES.
      >>TURN EC-SIZE-ZERO-DIVIDE CHECKING ON
          :
          COMPUTE A-REC = B-REC / C-REC.
          :
      END PROGRAM SAMPLE2.

(3) RAISING指定による例外オブジェクトの伝播

RAISING指定を使用して例外オブジェクトを伝播する場合,次の規則が適用されます。詳細は,マニュアル「COBOL2002 言語 標準仕様編 10.5.11(1) 例外」の例外オブジェクトの説明を参照してください。

EXIT文およびGOBACK文を使って例外オブジェクトを伝播する場合,呼び出し元プログラムおよび呼び出し先プログラムの状態によって,次に示す処理が実行されます。

呼び先し先のプログラムの状態呼び出し元のプログラムの状態
該当するUSE宣言手続きあり該当するUSE宣言手続きなし
PROPAGATE指令ONPROPAGATE指令OFF
手続き部見出しのRAISING指定あり手続き部見出しのRAISING指定なし
手続き部見出しのRAISING指定あり例外オブジェクトを伝播する。※1例外オブジェクトを伝播する。※2例外オブジェクトを伝播する。※3EC-OO-EXCEPTIONを伝播する。
手続き部見出しのRAISING指定なしEC-OO-EXCEPTIONを伝播する。
注※1
伝播後,該当する宣言手続きを実行します。
注※2
伝播後,GOBACK RAISING LASTを実行します。
注※3
伝播後,GOBACK RAISING EXCEPTION EC-OO-EXCEPTIONを実行します。

 

RAISING指定による例外オブジェクトの伝播の例を,次に示します。

<主プログラム:SAMPLE1.CBL>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE1.

      PROCEDURE DIVISION.
      DECLARATIVES.
      EXCEPTION-HANDLER SECTION.
          USE AFTER EXCEPTION CONDITION EC-OO-EXCEPTION. *> 3.
          DISPLAY FUNCTION EXCEPTION-STATUS.
      END DECLARATIVES.
      >>TURN EC-OO-EXCEPTION CHECKING ON
          CALL 'SAMPLE2'. *> 1.
          STOP RUN.

<副プログラム:SAMPLE2.CBL>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE2.

      ENVIRONMENT DIVISION.
      CONFIGURATION SECTION.
      REPOSITORY.
      CLASS EXCEPT-CLASS.

      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 OBJ USAGE OBJECT REFERENCE EXCEPT-CLASS.

      PROCEDURE DIVISION RAISING EXCEPT-CLASS.
          INVOKE EXCEPT-CLASS 'NEW' RETURNING OBJ.
          GOBACK RAISING OBJ. *> 2.
      END PROGRAM SAMPLE2.


      IDENTIFICATION DIVISION.
      CLASS-ID. EXCEPT-CLASS INHERITS BASE.

      ENVIRONMENT DIVISION.
      CONFIGURATION SECTION.
      REPOSITORY.
      CLASS BASE.
            :
      END CLASS EXCEPT-CLASS.

  1. プログラム「SAMPLE1」中のCALL文で,プログラム「SAMPLE2」を呼び出します。
  2. プログラム「SAMPLE2」中のGOBACK文のRAISING指定によって,例外オブジェクトの伝播が発生します。
    このとき,SAMPLE2の手続き部見出しのRAISING指定には,クラス名が指定されていますが,主プログラム「SAMPLE1」に発生した例外に対応するUSE宣言手続きやPROPAGATE指令がないため,GOBACK文の処理は,GOBACK RAISING EXCEPTION EC-OO-EXCEPTIONとなります。
  3. 例外の伝播によってCALL文で例外EC-OO-EXCEPTIONが検出され,該当するUSE手続きへ制御が移ります。