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.
-
プログラム「SAMPLE1」中のCALL文で,プログラム「SAMPLE2」を呼び出します。
-
プログラム「SAMPLE2」中のEXIT PROGRAM文のRAISING指定に,伝播させる例外名EC-BOUND-SUBSCRIPTが指定されているため,呼び出し元に例外が伝播します。
-
例外の伝播によってCALL文で例外が検出され,例外が引き起こされます。これによって,例外名EC-BOUND-SUBSCRIPTを指定したUSE手続きへ制御が移ります。
(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.
-
プログラム「SAMPLE1」中のCALL文で,プログラム「SAMPLE2」を呼び出します。
-
プログラム「SAMPLE2」中のCOMPUTE文で,例外EC-SIZE-ZERO-DIVIDEが引き起こされ,例外宣言手続きが実行されます。
-
EXIT PROGRAM文のRAISING LAST指定によって,最後に引き起こされた例外が呼び出し元のプログラムに伝播します。
-
例外の伝播によって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指令ON |
PROPAGATE指令OFF |
|||
手続き部見出しのRAISING指定あり |
手続き部見出しのRAISING指定なし |
|||
手続き部見出しのRAISING指定あり |
例外オブジェクトを伝播する。※1 |
例外オブジェクトを伝播する。※2 |
例外オブジェクトを伝播する。※3 |
EC-OO-EXCEPTIONを伝播する。 |
手続き部見出しのRAISING指定なし |
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.
-
プログラム「SAMPLE1」中のCALL文で,プログラム「SAMPLE2」を呼び出します。
-
プログラム「SAMPLE2」中のGOBACK文のRAISING指定によって,例外オブジェクトの伝播が発生します。
このとき,SAMPLE2の手続き部見出しのRAISING指定には,クラス名が指定されていますが,主プログラム「SAMPLE1」に発生した例外に対応するUSE宣言手続きやPROPAGATE指令がないため,GOBACK文の処理は,GOBACK RAISING EXCEPTION EC-OO-EXCEPTIONとなります。
-
例外の伝播によってCALL文で例外EC-OO-EXCEPTIONが検出され,該当するUSE手続きへ制御が移ります。