21.6 明示的な例外の引き起こし
COBOL2002では,明示的に例外を引き起こせます。明示的に例外を引き起こすと,ユーザプログラムが固有に定めたエラー状態を利用者定義例外として発生させたり,ある例外種別で実行される宣言手続き処理に対してユーザプログラムから明示的に例外を発生させて実行できます。これによって,宣言手続き処理を共通化できます。
共通例外処理で明示的に例外を引き起こすには,RAISE文を使用します。RAISE文にレベル3の例外名またはオブジェクト参照の一意名を指定して実行すると,指定した例外が引き起こされます。
RAISE文に指定する例外が例外名の場合,該当するTURN指令のチェックがONでなくても,例外が引き起こされます。
また,RAISE文に例外名EC-I-Oに関連する例外を指定して実行する場合,入出力状態は変更されません。
このシステムでは,ファイル名指定の例外宣言手続きは,ファイル名指定のない例外宣言手続きとみなします。
そのため,同じ名称の例外名を指定した例外宣言手続きが複数個定義されている場合は,最後に定義した例外宣言手続きが実行されます。
RAISE文については,マニュアル「COBOL2002 言語 標準仕様編」 「10.8.32 RAISE文」を参照してください。
RAISE文に例外名を指定して実行した場合の例を,次に示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE.
>>TURN EC-I-O CHECKING ON
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE1 ASSIGN TO 'FILENAME.EXT'.
DATA DIVISION.
FILE SECTION.
FD FILE1.
01 REC PIC X.
WORKING-STORAGE SECTION.
77 FILESTATUS PIC X(2) VALUE '00'.
PROCEDURE DIVISION.
DECLARATIVES.
IO-EXCEPTION-HANDLER1 SECTION.
USE AFTER EXCEPTION CONDITION EC-I-O-AT-END FILE FILE1. *> 2.
DISPLAY 'GENERAL HANDLER '.
CLOSE FILE1.
RESUME AT TERMINATION.
IO-EXCEPTION-HANDLER2 SECTION.
USE AFTER EXCEPTION CONDITION EC-I-O-AT-END. *> 3.
DISPLAY 'SPECIAL HANDLER FOR FILE1'.
CLOSE FILE1.
RESUME AT TERMINATION.
END DECLARATIVES.
OPEN INPUT FILE1.
RAISE EXCEPTION EC-I-O-AT-END. *> 1.
READ FILE1.
TERMINATION.
IF FILESTATUS NOT = '00'
DISPLAY 'RAISE FILESTATUS = ' FILESTATUS
END-IF.
STOP RUN.
END PROGRAM SAMPLE.-
RAISE文によって,例外EC-I-O-AT-ENDが引き起こされます。
-
IO-EXCEPTION-HANDLER1では,指定されたファイル名は無視されて,例外名EC-I-O-AT-ENDに対応します。ただし,3.に例外名EC-I-O-AT-ENDに対応する例外宣言手続きがあるため,2.の例外宣言手続きに処理は移りません。
-
IO-EXCEPTION-HANDLER2では,例外名EC-I-O-AT-ENDに対応します。2.の例外名EC-I-O-AT-ENDと同じ名称であるため,あとに指定された3.の例外名に対応する例外宣言手続きに処理が移り,DISPLAY文およびCLOSE文が実行されます。