宣言手続き内で,GOBACK文またはEXIT文のRAISING指定に伝播する例外を指定すると,指定した例外を呼び出し元のプログラムに伝播できます。RAISING指定には,例外名,オブジェクト参照一意名,またはLAST指定します。
RAISING指定については,「COBOL2002 言語 標準仕様編 10.8.20 EXIT文」を参照してください。
EXIT PROGRAM文のRAISING指定を使用した例外の伝播の例を,次に示します。
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.
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE2.
:
PROCEDURE DIVISION.
EXIT PROGRAM RAISING EXCEPTION EC-BOUND-SUBSCRIPT. *> 2.
END PROGRAM SAMPLE2.
EXIT文またはGOBACK文のRAISING指定にLASTを指定すると,実行単位で最後に引き起こされた例外を伝播できます。RAISING LAST指定は,宣言手続きの実行中だけで使用できます。
なお,何も例外が引き起こされていない状態では,RAISING LAST指定は無視されます。
RAISING LAST指定の例を,次に示します。
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.
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.
EXIT文またはGOBACK文のRAISING指定を使って,利用者定義例外,または例外オブジェクトを伝播する場合,手続き部見出しのRAISING指定に,利用者定義例外名,またはオブジェクトのクラス名もしくはインタフェース名を指定する必要があります。指定していない場合,RAISINGに例外名またはオブジェクト参照データを指定したときはコンパイルエラーとなり,RAISING LAST指定のときは例外名EC-RAISING-NOT-SPECIFIEDまたはEC-OO-EXCEPTIONが伝播されます。
手続き部見出しのRAISING指定の例を,次に示します。
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.
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.
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指定による例外オブジェクトの伝播の例を,次に示します。
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.
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.