21.7.1 組み込み関数を使用した例外情報の参照
次の組み込み関数を使用すると,実行単位で最後に引き起こされた例外(最新例外状態)の詳細な情報を取得できます。
- 〈この項の構成〉
(1) EXCEPTION-FILE関数
最新例外状態に関連するファイル結合子の入出力状態の値,およびファイル名称を返します。関数の戻り値の長さは,64バイトです。
EXCEPTION-FILE関数の戻り値を,次に示します。
例外の種類 |
関数の戻り値の内容 |
---|---|
入出力に関連する例外の場合※1 |
入出力状態とファイル名 |
入出力以外の例外の場合※2 |
00 |
- 注※1
-
入出力に関連する例外(例外名EC-I-Oに関連する例外)であっても,例外名EC-I-O-LINAGE,EC-I-O-EOP,またはEC-I-O-EOP-OVERFLOWの場合は,入出力状態が00となります。
- 注※2
-
入出力以外の例外の場合とは,次の状態を指します。
-
例外が検出されていない状態
-
RAISE文で,例外名EC-I-Oに関連する例外を指定して実行した場合
-
例外名EC-I-O以外の例外が引き起こされている状態
-
EXCEPTION-FILE関数については,マニュアル「COBOL2002 言語 標準仕様編」 「11.22 EXCEPTION-FILE関数」を参照してください。
(2) EXCEPTION-LOCATION関数
最新例外状態に関連する文の位置を返します。関数の戻り値の長さは,303バイトです。
EXCEPTION-LOCATION関数の戻り値は,プログラム/利用者定義関数/メソッドの名称,手続き名,およびソース行識別子から構成され,それぞれがセミコロン(;)と空白1文字で区切られた形式となっています。
EXCEPTION-LOCATION関数の戻り値を,次に示します。
例外の有無 |
関数の戻り値の内容 |
---|---|
例外あり |
|
例外なし |
英数字空白 |
- 例外ありの場合の形式
AAA…AA;△BB…B;△CCCCCCC/CCC
- AAA…AA
-
プログラム/利用者定義関数/メソッドの名称
- BB…B
-
手続き名
- CCCCCCC/CCC
-
ソース行識別子
- △
-
半角空白文字を示します。
それぞれの項目に返される値を,次に示します。
- プログラム/利用者定義関数/メソッド
-
プログラム/利用者定義関数/メソッド名称として返される値について,次に示します。
例外の引き起こされた位置を
含む定義の種別
関数の戻り値の内容
プログラム
プログラム名
利用者定義関数
利用者定義関数名
メソッド
メソッド名
- 手続き名
-
手続き名として返される値について,次に示します。
手続き名は,例外が発生した文の段落名,節名の有無によって出力内容が異なります。
手続きの種別
関数の戻り値の内容
段落名,節名あり※
段落名 OF 節名
段落名だけあり
段落名
節名だけあり※
節名
段落名,節名なし
何も戻さない
- 注※
-
-Optimize,2オプションの指定によって,そとPERFORM文のインライン展開が処理された場合,インライン展開によって段落名および手続き文が移動されます。このため,インライン展開された個所で例外が発生したとき,インライン展開されていない場合に返される手続き名の値と相違があります。
そとPERFORM文のインライン展開がされなかった個所(COMPUTE文)で例外が発生した場合に返される手続き名の相違の例を,次に示します。
インライン展開前の形式
インライン展開後の形式
AAA SECTION. PERFORM XXX. STOP RUN. BBB SECTION. XXX. COMPUTE A = B + 1. CCC SECTION. COMPUTE A = B + 2.
AAA SECTION. XXX. COMPUTE A = B + 1. STOP RUN. BBB SECTION. CCC SECTION. COMPUTE A = B + 2.
返される手続き名
XXX△OF△BBB
返される手続き名
XXX△OF△AAA
- ソース行識別子
-
ソース行識別子として返される値について,次に示します。
このシステムでのソース行識別子は,例外が発生した文の行番号7けたと欄番号3けたの間に/を追加したものとなります。なお,行番号が7けたを超える場合,または欄番号が3けたを超える場合,各最大けたを超える上位けたについては,けた落ちが発生します。
EXCEPTION-LOCATION関数については,マニュアル「COBOL2002 言語 標準仕様編」 「11.23 EXCEPTION-LOCATION関数」を参照してください。
(3) EXCEPTION-STATEMENT関数
例外が引き起こされた文の名前を返します。関数の戻り値の長さは,31バイトです。
EXCEPTION-STATEMENT関数の戻り値を,次に示します。
例外の有無 |
関数の戻り値の内容 |
---|---|
例外あり |
例外の発生した文の名前 |
例外なし |
英数字空白31文字 |
EXCEPTION-STATEMENT関数については,マニュアル「COBOL2002 言語 標準仕様編」 「11.24 EXCEPTION-STATEMENT関数」を参照してください。
(4) EXCEPTION-STATUS関数
最新例外状態に関連する例外名称を返します。関数の戻り値の長さは,31バイトです。
EXCEPTION-STATUS関数の戻り値を,次に示します。
引き起こされた例外の種別 |
関数の戻り値の内容 |
---|---|
例外名 |
例外名 |
例外オブジェクト |
EXCEPTION-OBJECT |
例外なし |
英数字空白31文字 |
EXCEPTION-STATUS関数については,マニュアル「COBOL2002 言語 標準仕様編」 「11.25 EXCEPTION-STATUS関数」を参照してください。
(5) 使用例
組み込み関数を使用して最新例外状態を参照するCOBOLプログラムの例を,次に示します。
IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE. : ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INFILE ASSIGN 'INPUT-FILE'. SELECT OUTFILE ASSIGN 'OUTPUT-FILE'. : DATA DIVISION. FILE SECTION. FD INFILE. 01 INREC PIC X(10). FD OUTFILE. 01 OUTREC PIC X(10). WORKING-STORAGE SECTION. 01 EOF-FLG PIC 9 VALUE 0. : PROCEDURE DIVISION. DECLARATIVES. EXCEPTION-HANDLING SECTION. USE AFTER EXCEPTION CONDITION EC-I-O. *> 2. DISPLAY FUNCTION EXCEPTION-FILE. DISPLAY FUNCTION EXCEPTION-LOCATION. DISPLAY FUNCTION EXCEPTION-STATEMENT. DISPLAY FUNCTION EXCEPTION-STATUS. IF FUNCTION EXCEPTION-STATEMENT = 'OPEN' THEN IF FUNCTION EXCEPTION-FILE (3 : ) = 'OUTFILE' THEN RESUME AT ERROR-HANDLE2 END-IF RESUME AT ERROR-HANDLE3 END-IF. RESUME AT ERROR-HANDLE1. END DECLARATIVES. >>TURN EC-I-O CHECKING ON OPEN INPUT INFILE. *> 1. OPEN OUTPUT OUTFILE. PERFORM UNTIL EOF-FLG = 1 READ INFILE WRITE OUTREC FROM INREC END-PERFORM. ERROR-HANDLE1. CLOSE OUTFILE. ERROR-HANDLE2. CLOSE INFILE. ERROR-HANDLE3. *> 3. STOP RUN. END PROGRAM 'SAMPLE'.
-
物理ファイル「INPUT-FILE」がない場合,OPEN文で永続誤りが発生し,最新例外状態が更新されます。
-
例外に該当する例外宣言手続きが実行されます。この手続き中で組み込み関数を使用すれば,例外の情報を参照できます。この例では,次の例外情報が組み込み関数の戻り値として取得されます。
組み込み関数名
関数の戻り値
EXCEPTION-FILE
35INFILE
EXCEPTION-LOCATION
SAMPLE;△;△0000035/011 ※
EXCEPTION-STATEMENT
OPEN
EXCEPTION-STATUS
EC-I-O-PERMANENT-ERROR
-
例外宣言手続き中のIF文の判定によって,RESUME ERROR-HANDLE3が実行され,手続きERROR-HANDLE3に復帰します。
(6) 注意事項
-
EXCEPTION-STATEMENT関数,EXCEPTION-STATUS関数では,関数の戻り値の英数字は,すべて大文字となります。
-
関数の戻り値に補われるスラント(/),セミコロン(;),空白文字は,英数字文字として扱われます。
-
関数の戻り値の長さに満たない場合は,英数字空白が補われます。
-
EXCEPTION-FILE関数,およびEXCEPTION-LOCATION関数に含まれる利用者定義語は,-EquivRule,NotExtend,-EquivRule,NotAny,または-EquivRule,StdCodeオプションが指定されていない場合,等価規則に基づいて変換されます。
-
EXCEPTION-LOCATION関数でのプログラム/利用者定義関数/メソッドの名称は,プログラム名,メソッド名,および利用者定義関数名の変換規則に基づいて変換されます。