実行される宣言手続きは,引き起こされた例外と,USE文に指定した例外によって決定します。実行される宣言手続きの詳細については,マニュアル「COBOL2002 言語 標準仕様編 10.8.53 USE文」を参照してください。
引き起こされた例外に対して宣言手続きを複数記述した場合,レベル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.
なお,例外名が「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.
宣言手続きからの復帰が行われない場合,例外の致命度によって,次の処理が実行されます。宣言手続きからの復帰については,「21.4.2 宣言手続きからの復帰」を参照してください。
例外名EC-FLOW-USEに対して実行される宣言手続きを,再帰的に実行するような処理にしないでください。このような処理にすると,無限ループが発生します。