11 章 例外割り込み処理機能
COBOL 2002 では、他の多くのオブジェクト指向言語がサポートしている例外割り込み処理機能が追加になりました。
伝統的な COBOL プログラムでは、プログラム全体のステップ数に対してエラーチェックの処理が占める割合はかなり多くなります。個々の処理ステップごとに、エラーの種別に応じてログファイルを残したり、コンソールへアラームを表示するプログラミングを記述すると、ステップ数が膨らんで生産性が低化します。さらに、プログラムの本来の処理がエラー処理に埋没してたいへん読みにくいプログラムになってしまいます。
例外割 り込み処 理機能は、 現在の COBOL で もサポー トされてい る、USE 文 を持つ
DECLARATIVES 手続きと同様に、各種のエラー発生時に宣言部分で記述されたエラー処理手続きが自動的に呼び出される機能です。

11.1 例外割り込み処理機能の概要
例外は、COBOL 文の実行時に発生するイベントです。COBOL 実行システムは、このイベントを検知すると、処理系によってまたはプログラマによって定義された所定の手続きに分岐します。これが例外割り込み機能です。
一般には、例外処理はオペレーティングシステムの機能として提供されています。UNIXではシグナル処理がこれにあたり、汎用機では、十進演算などの COBOL 用の機械語命令が例外を起こすと、COBOL 実行システムがオペレーティングシステムを経由してこれを検知し、エラー報告を行っています。
COBOL 2002 が提供する例外割り込み機能では、このようなハードウェアやオペレーティングシステムが管理する例外を取り扱うことができますが、さらに、COBOL 独自の例
外やプログラマが定義する例外も取り扱えるようになっています。
例外が発生すると、宣言部分に書かれた所定の手続きが実行されますが、その後の処理は、例外の種類によって異なります。「致命的な」例外と呼ばれる一群の例外では、プログラ
ムは実行を停止します。「非致命的な」例外の場合は、引き続き実行を継続します。プロ
グラマが定義する例外はすべて「非致命的な」例外となります。

COPYRIGHT

2001

COBOL コンソーシアム

1

11.2 例外名
例外には、システムが定義するものとプログラマが定義するものとがあります。前者は、さらに COBOL 規格が定義するものと COBOL 処理系作成者が定義するものに分かれます。
COBOL 規格が定義する例外には、表の添え字範囲あふれ、十進データ不正、ゼロによる割り算などのおなじみのものがあります。COBOL

2002 以前は、このようなエラーが発生したときの動作は、ON SIZ E ERROR 指定などが書かれていない限り規定されていませんでした。
プログラマが定義する例外とは、例えば、「預金残高不足」とか「在庫数量割れ」といったものになるでしょう。
COBOL 2002 では、これら各種の例外をプログラマが識別するために、例外名を用います。例外名は、以下の 3 階層で分類されています：

レベル 1 例外名：
EC‑ALL、すべての例外をあらわす。
レベル 2 例外名：
EC‑I‑O など、例外を 19 に類別したそれぞれの代表名。
レベル 3 例外名：
レベル 2 例外名に、ハイフンと文字列をつけた名前で、個別の例外をあらわす。

以降に、COBOL 規格が定める例外名の一覧を示します。カテゴリ欄は、例外が致命的であるかどうかを示します。「作成者定義」は、致命的であるかどうかを COBOL 処理系作成者が定めるものを示します：
例外名

カテゴリ

EC‑ALL
EC‑ARGUMENT
EC‑ARGUMENT‑FUNCTION
EC‑ARGUMENT‑IMP
EC‑BOUND
EC‑BOUND‑IMP
EC‑BOUND‑ODO
EC‑BOUND‑PTR
EC‑BOUND‑REF‑MOD
EC‑BOUND‑SUBSCRIPT
EC‑BOUND‑TABLE‑LIMIT
EC‑DATA
EC‑DATA‑IMP

COPYRIGHT

2001

致命的
作成者定義
作成者定義
致命的
致命的
致命的
致命的
致命的
作成者定義

説明
すべての例外
引数エラー
関数引数エラー
処理系作成者定義の引数エラー
区域外処理系作成者定義の区域外
OCCURS DEPENDING データ項目が区域外
ポインタデータ項目の内容が区域外
区域外の部分参照
区域外の添え字付け
動的な表の大きさ違反
データ例外
処理系作成者定義のデータ例外

COBOL コンソーシアム

2

EC‑DATA‑INCOMPATIBLE
EC‑DATA‑PTR‑NULL
EC‑FLOW
EC‑FLOW‑GLOBAL‑EXIT
EC‑FLOW‑GLOBAL‑GOBACK
EC‑FLOW‑IMP
EC‑FLOW‑RELEASE
EC‑FLOW‑RETURN
EC‑FLOW‑USE
EC‑I‑O
EC‑I‑O‑AT‑END
EC‑I‑O‑F ILE‑SHARING
EC‑I‑O‑IMP
EC‑I‑O‑INVALID‑KEY
EC‑I‑O‑LINAGE
EC‑I‑O‑LOGIC‑ERROR
EC‑I‑O‑PERMANENT‑ERROR
EC‑I‑O‑RECORD‑OPERATION
EC‑IMP
EC‑LOCALE
EC‑LOCALE‑IMP
EC‑LOCALE‑
INCOMPATIBLE
EC‑LOCALE‑MISSING
EC‑LOCALE‑SIZ E
EC‑OO
EC‑OO‑CONFORMANCE
EC‑OO‑EXCEPTION
EC‑OO‑IMP
EC‑OO‑INTRINSIC
EC‑OO‑METHOD
EC‑OO‑NULL
EC‑OO‑RESOURCE
EC‑OO‑UNIVERSAL
EC‑ORDER
EC‑ORDER‑IMP
EC‑ORDER‑NOT‑
SUPPORTEDEC‑OVERFLOW
EC‑OVERFLOW‑IMP
EC‑OVERFLOW‑MEMORYCOPYRIGHT

2001

致命的
致命的致命的致命的作成者定義
致命的致命的致命的

矛盾データ例外
基底付き項目ポインタの NULL 参照
実行制御フロー違反
大域的な宣言手続き中での EXIT PROGRAM
大域的な宣言手続き中での GOBACK

非致命的
非致命的
作成者定義
非致命的
致命的
致命的
致命的

処理系作成者定義のフロー違反
RELEASE が SORT の範囲内にない
RETURN が SORT や MERGE の範囲内にない
USE 文が別の USE 文を実行させた
入出力例外
入出力状態「1x」
入出力状態「6x」
入出力状態「9x」
入出力状態「2x」
LINAGE データ項目の値が要求範囲外
入出力状態「4x」
入出力状態「3x」

非致命的入出力状態「5x」

作成者定義
致命的処理系作成者定義の例外
地域固有仕様に関連するすべての例外
処理系作成者定義の地域固有仕様関連例外
参照した地域固有仕様に期待の文字指定がな
い
指定した地域固有仕様では使用できない
地域固有仕様の編集で数値は切り捨てられたOO に関連するすべての既定儀例外
オブジェクト修正子に対する不成功
例外オブジェクトが処理されなかった処理系作成者定義の OO 例外
在来データ項目の型チェックが失敗した
要求されるメソッドが使用可能でない
NULL オブジェクト参照によるメソッド起動
オブジェクトのためのシステム資源不足
実行時の型チェックが失敗した
順序付け例外処理系作成者定義の順序付け例外
順序付けが未サポート

作成者定義
致命的

桁あふれ条件処理系作成者定義の桁あふれ条件
システム限界のため動的表が拡張不可能

作成者定義
非致命的
致命的
致命的
致命的
致命的
作成者定義
致命的
致命的
致命的
致命的
致命的

COBOL コンソーシアム

3

EC‑OVERFLOW‑ST RING
EC‑OVERFLOW‑
UNSTRING
EC‑PROGRAM
EC‑PROGRAM‑ARG‑MISMATCH
EC‑PROGRAM‑ARG‑
OMMITED
EC‑PROGRAM‑CANCEL‑
ACTIVE
EC‑PROGRAM‑IMP
EC‑PROGRAM‑NOT‑FOUND
EC‑PROGRAM‑PTR‑NULL
EC‑PROGRAM‑
RECURSIVE‑CALL
EC‑PROGRAM‑RESOURCES
EC‑RAISING
EC‑RAISING‑IMP
EC‑RAISING‑NOT‑
SPECIFIED
EC‑RANGE
EC‑RANGE‑IMP
EC‑RANGE‑INDEXEC‑RANGE‑INSPECT‑SIZE

非致命的
非致命的

STRING 文の桁あふれ条件
UNSTRING 文の桁あふれ条件

致命的プログラム間連絡例外
引数の不一致致命的省略された引数への参照

非致命的

取り消されるプログラムが活性状態

作成者定義
致命的

処理系作成者定義のプログラム間連絡例外
呼ばれるプログラムが見つからず

致命的
致命的

NULL ポインタによる CALL 文
呼ばれるプログラムが活性状態

致命的呼ばれるプログラムで資源が使用不能

作成者定義
致命的

EXIT RAISING 例外
処理系作成者定義の EXIT RAISING 例外
ユーザ定義例外名が USING に書かれていない

EC‑RANGE‑PERFORM‑
VARYING
EC‑RANGE‑SEARCH‑INDEX
EC‑RANGE‑SEARCH‑NO‑
MATCH
EC‑REPORT
EC‑REPORT‑ACTIVE
EC‑REPORT‑COLUMN‑OVERLAP
EC‑REPORT‑FILE‑MODE
EC‑REPORT‑IMP
EC‑REPORT‑INACTIVE

致命的範囲例外
処理系作成者定義の範囲例外
指標が負の値か限界を超えている
INSPECT 文での置き換え項目の大きさが異なる
PERFORM VARYING の項目の値が負

非致命的

SEARCH 文の指標の初期値が範囲外

非致命的

SEARCH 文で探索基準に合致する要素なし

致命的
非致命的

報告書作成機能例外
既に INITIATE された報告書に対する INITIATE
報告書項目の重なり

EC‑REPORT‑LINE‑OVERLAP
EC‑REPORT‑LINE‑WIDTH

非致命的報告書ファイルのオープンモードが不正処理系作成者定義の報告書作成機能例外
未INITIATEの 報 告 書 でGENERATE/TERMINATE
報告書行の重なり

非致命的

行幅を超えたCOPYRIGHT

2001

作成者定義
致命的致命的

致命的
作成者定義
致命的

COBOL コンソーシアムの4EC‑REPORT‑NOT‑TERMINATED
EC‑REPORT‑PAGE‑LIMIT
EC‑REPORT‑SUM‑SIZE
EC‑SCREEN
EC‑SCREEN‑FIELD‑OVERLAP
EC‑SCREEN‑IMP
EC‑SCREEN‑ITEM‑TRUNCATED
EC‑SCREEN‑LINE‑NUMBER
EC‑SCREEN‑STARTING‑
COLUMN
EC‑SIZE
EC‑SIZE‑
EXPONENTIAT ION
EC‑SIZE‑IMP
EC‑SIZE‑OVERFLOW
EC‑SIZE‑TRUNCAT ION
EC‑SIZE‑UNDERFLOW
EC‑SIZE‑ZERO‑DIVIDE
EC‑SORT‑MERGE
EC‑SORT‑MERGE‑ACTIVE
EC‑SORT‑MERGE‑FILE‑
OPEN
EC‑SORT‑MERGE‑IMP
EC‑SORT‑MERGE‑RELEASE
EC‑SORT‑MERGE‑
RETURN
EC‑SORT‑MERGE‑SEQUENCE
EC‑STORAGE
EC‑STORAGE‑IMP
EC‑STORAGE‑NOT ‑ALLOC
EC‑STORAGE‑NOT ‑AVAIL
EC‑VALIDATEEC‑VALIDATE‑CONTENT
EC‑VALIDATE‑FORMATEC‑VALIDATE‑IMP
EC‑VALIDATE‑RELATION
EC‑USER
EC‑USER‑XXX

COPYRIGHT

2001

非致命的

未 TERMINATE の報告書ファイルの CLOSE

非致命的
致命的
非致命的

縦方向のページの境界を越えた
合計カウンタの桁あふれ
画面操作例外画面フィールドの重なり

作成者定義
非致命的

処理系作成者定義の画面操作例外
行に対して画面フィールドが長すぎる

非致命的

画面項目の行位置が端末の大きさを超えた

非致命的

画面項目の開始位置が行の大きさを超えた

致命的

桁あふれ例外
べき乗演算規則の違反

作成者定義
致命的
致命的
致命的致命的
致命的
致命的

処理系作成者定義の桁あふれ例外
計算での算術桁あふれ
格納での有効桁切り捨て
浮動小数点の下位桁あふれゼロによる除算
SORT/MERGE の例外
オープン済みファイルへの SORT/MERGE

作成者定義
致命的

処理系作成者定義の SORT/MERGE の例外
RELEASE レコードが長すぎまたは短すぎ

致命的

AT END 後に RETURN が実行された

致命的ファイルに対する順序エラー
記憶領域割り当て例外
処理系作成者定義の記憶領域割り当て例外
割り当てられていない領域の FREE
ALLOCAT E 文で領域取得不可能
VALIDATE 例外
VALIDATE の内容エラー
VALIDATE の形式エラー
処理系作成者定義の VALIDATE 例外
VALIDATE の比較エラー
利用者定義の例外
レベル３の利用者定義の例外

COBOL コンソーシアム

5

11.3 TURN コンパイル指令
プログラムで例外のチェックを行うかどうかは、コンパイル時に TURN 指令を使用して、例外名ごとに指定することができます。
この指令の省略値は何の例外もチェックしません。従って、例外処理機能を使用するには、以下の指令を指定することが必要です。

例外名１
EC-I-O［ファイル名１]…

EC-I-O-AT-END［ファイル名１]>>TURN…

EC-I-O-INVALID-KEY［ファイル名１]EC-I-O-PARMANET-ERROR［ファイル名１]EC-I-O-LOGIC-ERROR［ファイル名１]

CHECKING

COPYRIGHT

2001

…

…
…

…

ON [WITH LOCATION]OFF

COBOL コンソーシアム

6

11.4 例外割り込み処理機能の手続き部
11.4.1 手続き部の枠組み
例外処理を使用するプログラムの手続き部は、次の形をとります：

PROCEDURE DIVISION RAISING 例外名 1. Á 例外名 1 を起こす副プログラムを宣言
DECLARATIVES.
例外処理 SECTION.
USE AFTER EXCEPTION 例外名 2.

Á 例外名 2 に対する処理手続きの宣言…
RESUMEÁ 例外処理手続きからの戻り…
END DECLARATIVES.
手続き処理 SECTION.
…
IF エラーRAISE EXCEPTION 例外名 2.

Á プログラマ定義例外の発生…
EXIT PROGRAMRAISING EXCEPTION 例外名 1.

Á 呼び出し側に例外を発生させる

11.4.2 手続き部見出し
手続き部見出しの RAISING 指定では、プログラマ定義の例外名 (EC‑USER‑XXX) を書
き、プログラムが EXIT 文で発生させる可能性のある例外を宣言します。

PROCEDURE

DIVISION[ US ING 指 定 ][ RE TURNING

データ名 2 ]例外名 1

RAIS ING

クラス名 1．．．

.

インタフェース名 1

COPYRIGHT

2001

COBOL コンソーシアム

7例えば、「倉庫から商品を出荷する」というプログラムが、「在庫数量割れ」という例外を発生するように作成したとします。このプログラムを呼び出したプログラムは、CALL文でその例外が発生し、呼び出し側に宣言された例外処理手続きが実行されることになります。

11.4.3 宣言部分宣言部分の構成は、従来の入出力エラー処理手続きの宣言と変わりありません。変わったのは USE 文の新しい書き方が追加になっただけです。
11.2 で説明したように、例外名には入出力例外も含まれていますので、従来のファイル例外についての宣言手続きの書き方と、新しい例外処理の宣言手続きは、同じ目的のために同居することができます。
[ DE CLARATIVES.
{ 節名SECTION .

USE 文 .

[完 結 文 ] ．．． [ 段 落 名 .
END

DE CLARATIVES.

[ 完 結 文 ] ．．． ] ．．． } ．．．

]

11.4.4 EXIT PROGRAM 文
手続き部見出しの RAISING 指定で宣言した例外名は、EXIT

PROGRAM 文の RAISING

指定に書くことによって例外を発生させます。
RAISING 指定の無い EXIT PROGRAM 文は、例外を発生させること無く呼び出し側プログラムに正常リターンします。呼び出し側プログラムに対して例外の発生を知らせたいと
きだけ RAISING 指定のある EXIT PROGRAM 文で戻ります。
従来のプログラミングでは、副プログラムを呼び出すと必ずそのあとで副プログラムが返すエラーコードをチェックするコードが書かれていました。この機能を使うと、呼び出し側で宣言手続きを書くだけで、各呼出し毎に毎回チェックする必要がなくなります。

EXIT

PROGRAM
例外名 1

RAIS ING

クラス名 1．．．

.

インタフェース名 1

COPYRIGHT

2001

COBOL コンソーシアム

8

11.4.5 RESUME 文
致命的でない例外については、宣言手続きの実行後、プログラム実行を再開することができます。通常は、宣言手続きが末尾まで実行されるか、EXIT 文に到達するところで、例外を生じた文の次の実行文から再開することになります。宣言手続き中に RESUME 文を書くと、即座に例外処理を停止して処理を再開することができます。

RE SUMEATNE XT STATE MENT
手続き名 1

11.4.6 RAISE 文
プログラマ定義の例外を明示的に発生させるには RAISE 文を使います。

RAIS EEXCEPTION 例 外 名 1
一意名 1

11.4.7 USE 文
例外処理で使用する宣言手続きに対しては、以下の形式の USE 文を使用して、特定の例外や特定のファイルに対する特定の例外についての例外処理を指定します。

US E AFTER EXCEPTION

例外名 1
例外名 2 { ファイル名 2 }例外名には、レベル 1、レベル 2 、レベル 3 のどの例外名を書くこともできます。例外が発生したときに、その例外の種別が宣言部分に書かれた複数の USE 文に合致する場合、レベル 3 の例外名に関する USE 文が書かれていればそれが最優先となり、次いでレベル 2、レベル 3 の順で選択されます。

COPYRIGHT

2001

COBOL コンソーシアム

911.4.8 例外処理の組み込み関数
例外処理を使用するために便利ないくつかの組み込み関数が用意されています。
EXCEPTION‑FILE 関数

最近に発生した例外に関連するファイルのステータス値とファイル名を返す。

EXCEPTION‑LOCATION 関数

最近に発生した例外の発生箇所を返す。プログラム名、段落名、行番号などの処理系作成者定義形式。

EXCEPTION‑STATEMENT 関数

最近に例外を発生した COBOL 文の名前 (「MOVE」など)を返す。

EXCEPTION‑STATUS 関数

最近に発生した例外の例外名を返す。

COPYRIGHT

2001

COBOL コンソーシアム

10