37.7.3 COBOL実行時ライブラリが検出する例外
(1) 例外種別の出力
-DebugInf,-DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRangeオプションのどれかを指定してコンパイルしプログラムを実行した場合に例外が発生すると,COBOLがこれを検知し,実行時メッセージ,および異常終了時要約情報リストで例外種別を出力します。この情報によって,どのような例外が発生したか,および例外がどの実行文で発生しているかを把握できます。
実行時メッセージ,および異常終了時要約情報リストに表示される例外種別とその意味を次に示します。
例外種別 |
意味 |
---|---|
RUNTIME ERROR |
COBOL実行時エラーが発生した。 |
CBLABN |
CBLABNサービスルーチンが呼び出された。 |
EXCEPTION_ACCESS_VIOLATION |
「表37‒3 代表的なアプリケーションエラー」の「アクセス違反」を参照 |
EXCEPTION_INT_DIVIDE_BY_ZERO |
「表37‒3 代表的なアプリケーションエラー」の「ゼロ除算」を参照 |
EXCEPTION_INT_OVERFLOW |
整数演算の結果,最上位ビットのキャリーアウトが発生した。 |
EXCEPTION_FLT_DENORMAL_OPERAND |
浮動小数点演算で使用している作用対象に異常があり,その値が小さ過ぎるため,標準の浮動小数点値として表せない。 |
EXCEPTION_FLT_DIVIDE_BY_ZERO |
浮動小数点値を浮動小数点値0で割ろうとした。 |
EXCEPTION_FLT_INEXACT_RESULT |
浮動小数点演算の結果を10進小数として正確に表せない。 |
EXCEPTION_FLT_OVERFLOW |
浮動小数点演算の指数の値が,対応する型の上限値を超えている。 |
EXCEPTION_FLT_UNDERFLOW |
浮動小数点演算の指数の値が,対応する型の下限値を超えている。 |
EXCEPTION_FLT_STACK_CHECK |
浮動小数点演算の結果,スタックのオーバフローまたはアンダーフローが発生した。 |
EXCEPTION_FLT_INVALID_OPERATION |
この表にないすべての浮動小数点例外を表す。 |
EXCEPTION_PRIV_INSTRUCTION |
現在のマシンモードでは実行できない演算命令を実行しようとした。 |
STATUS_NONCONTINUABLE_EXCEPTION |
実行を続行できない例外の発生後,実行を続行しようとした。 |
(2) プロセスの終了
異常終了時要約情報リストを出力後,プロセスは終了コード1で終了します。
ただし,環境変数CBLEXCEPT=THROWを指定したときはシステムが返す値が設定されます。
(3) 例外発生時の動作を指定する実行時環境変数CBLEXCEPT
- 形式
CBLEXCEPT=THROW
- 規則
-
この環境変数にTHROWを指定すると,デバッグ用コンパイラオプション-DebugInf,-DebugInf,Trace,-DebugCompati,-DebugData,-TDInf,-CVInf,-DebugRangeのどれかを指定したプログラムの実行中に例外が発生した場合,例外コードを上位プログラムにスローします。
このとき,異常終了時要約情報リストを出力し,終了方法は上位の制御プログラムの終了処理に依存します。
例えば,デバッグ環境を構築できない環境でシステム例外発生時のデバッグをする場合に指定します。
この環境変数を指定したときの動作を次に示します。
-
COBOLプログラムがメインでないアプリケーションやGUIプログラムでは,この環境変数を指定しても,有効となりません。
-
CBLDBGINFサービスルーチンを呼び出した場合は,例外コードを上位プログラムにスローしません。
-
THROWを指定した場合,ハードウェア例外やソフトウェア例外の発生により異常終了したとき,Windows問題レポートの設定などによって,クラッシュダンプが出力される場合があります。
クラッシュダンプからシステム例外発生時点のスタックトレースなどを参照するために有用なコンテキスト情報のアドレスが実行時メッセージ中に出力されます。
また,上位プログラムのユーザープログラムに例外処理があれば,そちらに制御が移ります。
なお,ミドルソフトなどでこの例外処理を実装している場合もありますので,異常終了時の出力情報を確認してください。
-
この環境変数を指定しても実行性能への影響はありません。