従来形式の例外処理を実行する場合,検出した例外に対する例外名のTURN指令のチェックがONであれば,最新例外状態が更新されます。ただし,従来形式の例外処理のうちON SIZE ERROR指定については,ON SIZE ERRORを実行する際に例外が検出されないため,TURN指令のチェックがONであっても最新例外状態は更新されません。従来形式の例外処理を実行する場合に,最新例外状態が更新される例外処理と,更新されない例外処理を,次に示します。
従来形式の宣言手続きと共通例外処理の宣言手続きを同時に指定した場合,従来形式の宣言手続きが優先して実行されます。ただし,例外を検出したプログラムが入れ子プログラムで,上位プログラムにGLOBAL句を指定した従来形式の宣言手続きが定義されているときは,入れ子プログラム中の共通例外処理の宣言手続きが優先して実行されます。
従来形式の宣言手続きが優先される例を,次に示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INFILE ASSIGN 'INPUT-FILE'.
DATA DIVISION.
FILE SECTION.
FD INFILE.
01 INREC PIC X(10).
WORKING-STORAGE SECTION.
01 READDATA PIC X(10).
PROCEDURE DIVISION.
DECLARATIVES.
EXCEPTION-HANDLE1 SECTION.
USE AFTER STANDARD EXCEPTION PROCEDURE INFILE. *> 2.
DISPLAY '従来形式USE実行'.
EXCEPTION-HANDLE2 SECTION.
USE AFTER EXCEPTION CONDITION EC-I-O. *> 3.
DISPLAY '共通例外処理USE実行'.
END DECLARATIVES.
>>TURN EC-I-O CHECKING ON
OPEN INPUT INFILE.
READ INFILE INTO READDATA. *> 1.
DISPLAY READDATA.
CLOSE INFILE.
END PROGRAM SAMPLE.
上記の例の場合,プログラム中のREAD文(1.)によって例外が引き起こされた場合,従来形式の宣言手続き(2.)が共通例外処理(3.)より優先して実行されます。
COBOL85では,入出力エラーが発生した場合にFILE STATUS句の指定があると実行を継続しますが,COBOL2002では,FILE STATUS句より共通例外処理が優先されます。そのため,入出力エラーが発生して共通例外処理が実行された場合,FILE STATUS句の指定があっても実行が継続されません。
FILE STATUS句の指定の有無と共通例外処理の関係を,次に示します。
発生した入出力エラーに対応するTURN指令の状態 | 入出力エラーに対応するUSE文 | FILE STATUS句の有無 | 入出力エラー発生時の動作 |
---|---|---|---|
ON | なし | ○ | 実行時エラー※ |
× | 実行時エラー※ | ||
新形式 | ○ | 新形式のUSE文を実行 | |
× | 新形式のUSE文を実行 | ||
従来形式 | ○ | 従来形式のUSE文を実行 | |
× | 従来形式のUSE文を実行 | ||
新形式 従来形式 | ○ | 従来形式のUSE文を実行 | |
× | 従来形式のUSE文を実行 | ||
OFF | なし | ○ | 実行を継続 |
× | 実行時エラー※ | ||
新形式 | ○ | 実行を継続 | |
× | 実行時エラー※ | ||
従来形式 | ○ | 従来形式のUSE文を実行 | |
× | 従来形式のUSE文を実行 | ||
新形式 従来形式 | ○ | 従来形式のUSE文を実行 | |
× | 従来形式のUSE文を実行 |