21.4.1 実行される宣言手続き
実行される宣言手続きは,引き起こされた例外と,USE文に指定した例外によって決定します。実行される宣言手続きの詳細については,マニュアル「COBOL2002 言語 標準仕様編」 「10.8.53 USE文」を参照してください。
(1) 例外によって実行される宣言手続き
- 例外名に関連する場合
-
引き起こされた例外が例外名に関連する場合は,例外に対応する例外名,または上位レベルの例外名が指定されたUSE文の宣言手続きが実行されます。
- 例外オブジェクトの場合
-
引き起こされた例外オブジェクトに適合するクラス名またはインタフェース名が指定されたUSE文の宣言手続きが実行されます。
(2) 実行される宣言手続きの優先順位
引き起こされた例外に対して宣言手続きを複数記述した場合,レベル3,レベル2,レベル1の順に検索され,宣言手続きが一つだけ実行されます。
次の例では,引き起こされた例外の例外名EC-SIZE-ZERO-DIVIDEに対して,実行される宣言手続きがEXCEPTIONHANDLER1(例外名EC-SIZEに該当)とEXCEPTIONHANDLER2(例外名EC-SIZE-ZERO-DIVIDEに該当)の2種類があります。この場合,レベル2の例外よりもレベル3の例外が優先されるため,EXCEPTIONHANDLER1は実行されないで,EXCEPTIONHANDLER2が実行されます。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE. >>TURN EC-SIZE CHECKING ON DATA DIVISION. WORKING-STORAGE SECTION. 01 A PIC 9. 01 B PIC 9 VALUE 0. 01 C PIC 9. PROCEDURE DIVISION. DECLARATIVES. EXCEPTION-HANDLER1 SECTION. USE AFTER EXCEPTION CONDITION EC-SIZE. *> 2. DISPLAY 'EC-SIZE'. EXCEPTION-HANDLER2 SECTION. USE AFTER EXCEPTION CONDITION EC-SIZE-ZERO-DIVIDE. *> 3. DISPLAY FUNCTION EXCEPTION-STATUS. END DECLARATIVES. DIVIDE A BY B GIVING C. *> 1. END PROGRAM SAMPLE.
-
DIVIDE文で例外EC-SIZE-ZERO-DIVIDEが引き起こされます。
-
EXCEPTION-HANDLER1は,例外名EC-SIZEに対応するため,1.の例外に該当します。しかし,EXCEPTION-HANDLER1は実行されないで,より下位のレベルEC-SIZE-ZERO-DIVIDEの例外宣言手続きが優先されます。
-
EXCEPTION-HANDLER2は,例外名EC-SIZE-DIVIDEに対応するため,1.の例外に該当します。さらに,EXCEPTION-HANDLER1の例外名EC-SIZEより下位のレベルのため,EXCEPTION-HANDLER2が優先となります。EXCEPTIONHANDLER2が実行され,DISPLAY文で「EC-SIZE-ZERO-DIVIDE」と表示されます。
なお,例外名が「EC-I-O-」ではじまる入出力例外は,ファイル名を指定する形式とファイル名を指定しない形式の2種類が指定できますが,両方の形式の例外宣言手続きを指定した場合,ファイル名を指定する形式の方が優先されます。
次の例では,FILE1のREAD文で例外が引き起こされると,IO-EXCEPTION-HANDLER2の方が実行されます。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE. >>TURN EC-I-O CHECKING ON ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FILE1 ASSIGN TO 'FILENAME.TXT'. DATA DIVISION. FILE SECTION. FD FILE1. 01 REC PIC X. WORKING-STORAGE SECTION. 77 FILESTATUS PIC X(2). 77 LOOP-EXIT-FLAG PIC 9 VALUE 0. PROCEDURE DIVISION. DECLARATIVES. IO-EXCEPTION-HANDLER1 SECTION. USE AFTER EXCEPTION CONDITION EC-I-O-AT-END. *> 2. DISPLAY 'GENERAL HANDLER' RESUME AT TERMINATION. IO-EXCEPTION-HANDLER2 SECTION. USE AFTER EXCEPTION CONDITION EC-I-O-AT-END FILE FILE1. *> 3. DISPLAY 'SPECIAL HANDLER FOR FILE1' CLOSE FILE1 RESUME AT TERMINATION. END DECLARATIVES. OPEN INPUT FILE1 PERFORM UNTIL LOOP-EXIT-FLAG = 1 READ FILE1 *> 1. IF FILESTATUS NOT = '00' AND '10' THEN MOVE 1 TO LOOP-EXIT-FLAG DISPLAY 'READ FILESTATUS = ' FILESTATUS END-IF END-PERFORM. TERMINATION. STOP RUN. END PROGRAM SAMPLE.
-
READ文で例外EC-I-O-AT-ENDが引き起こされます。
-
IO-EXCEPTION-HANDLER1は,例外名EC-I-O-AT-ENDに対応するため,1.の例外に該当します。しかし,IO-EXCEPTION-HANDLER1は実行されないで,ファイル名を指定した例外宣言手続きが優先されます。
-
EXCEPTION-HANDLER2は,例外名EC-I-O-AT-ENDに対応するため,1.の例外に該当します。さらに,ファイル名が指定されているため,IO-EXCEPTION-HANDLER1よりIO-EXCEPTION-HANDLER2の方が優先となります。
IO-EXCEPTION-HANDLER2が実行され,DISPLAY文で「SPECIAL HANDLER FOR FILE1」と表示したあと,FILE1を閉じて手続き名TERMINATIONに復帰し,プログラムが終了します。
(3) 宣言手続き実行後の処理
宣言手続きからの復帰が行われない場合,例外の致命度によって,次の処理が実行されます。
- 致命的な例外の場合
-
宣言手続きの実行後,実行単位が終了します。ただし,例外名EC-I-Oに関連する例外の場合は,各文の一般規則に従って,実行が継続されます。
- 非致命的な例外の場合
-
宣言手続きを実行後,各文の一般規則に従って実行が継続されます。
宣言手続きから復帰した場合は,致命度に関係なく実行が継続されます。宣言手続きからの復帰については,「21.4.2 宣言手続きからの復帰」を参照してください。
(4) 注意事項
例外名EC-FLOW-USEに対して実行される宣言手続きを,再帰的に実行するような処理にしないでください。このような処理にすると,無限ループが発生します。