COBOL2002 ユーザーズガイド

[目次][用語][索引][前へ][次へ]

22.3.3 例外チェックが無効な場合の動作

<この項の構成>
(1) 手続き文の実行中にエラーが発生し,例外を検出した場合
(2) 伝播によって例外を検出した場合

(1) 手続き文の実行中にエラーが発生し,例外を検出した場合

手続き文でエラーが発生して例外を検出した際に,該当する例外チェックが無効な場合は,検出された例外,コンパイラオプションの指定,および例外が検出された文に対する無条件文の指定によって,動作が異なります。

共通例外処理で取り扱える例外名について,例外チェックが無効な場合の動作を,次に示します。

表22-5 エラー発生後に検出した例外に対して例外チェックが無効な場合の動作

例外名 例外チェックが無効な場合の動作
EC-ALL 以下のレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-ARGUMENT EC-ARGUMENTに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-ARGUMENT-FUNCTION 実行時エラーで異常終了。
EC-ARGUMENT-IMP 実行時エラーで異常終了。
EC-BOUND EC-BOUNDに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-BOUND-ODO エラーとならないが,実行結果は保証しない。※1
EC-BOUND-REF-MOD
  • -DebugCompatiオプションなしの場合
    エラーとならないが,実行結果は保証しない。※1
  • -DebugCompatiオプションありの場合
    実行時エラーで異常終了。
EC-BOUND-SUBSCRIPT
  • -DebugCompatiまたは-DebugRangeオプションなしの場合
    エラーとならないが,実行結果は保証しない。※1
  • -DebugCompatiまたは-DebugRangeオプションありの場合
    実行時エラーで異常終了。
EC-DATA EC-DATAに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-DATA-PTR-NULL アプリケーションエラー(ハードウェア例外)で異常終了。
EC-FLOW EC-FLOWに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
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に関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-I-O-AT-END
  • -Compati85,IoStatusオプションなしの場合
    エラーとならない。
  • -Compati85,IoStatusオプションありの場合
    AT END指定がない場合は実行時エラーで異常終了。
EC-I-O-EOP エラーとならない。
EC-I-O-EOP-OVERFLOW エラーとならない。
EC-I-O-IMP 実行時エラーで異常終了。
EC-I-O-INVALID-KEY
  • -Compati85,IoStatusオプションなしの場合
    エラーとならない。
  • -Compati85,IoStatusオプションありの場合
    INVALID KEY指定がない場合は実行時エラーで異常終了。
EC-I-O-LINAGE
  • -Compati85,Linageオプションなしの場合
    実行時エラーで異常終了。
  • -Compati85,Linageオプションありの場合
    エラーとならない。
EC-I-O-LOGIC-ERROR 実行時エラーで異常終了。
EC-I-O-PERMANENT-ERROR 実行時エラーで異常終了。
EC-OO EC-OOに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-OO-CONFORMANCE 実行時エラーで異常終了。
EC-OO-EXCEPTION 実行時エラーで異常終了。
EC-OO-IMP 実行時エラーで異常終了。
EC-OO-METHOD 実行時エラーで異常終了。
EC-OO-NULL 実行時エラーで異常終了。
EC-OO-RESOURCE 実行時エラーで異常終了。
EC-OO-UNIVERSAL 実行時エラーで異常終了。
EC-OVERFLOW EC-OVERFLOWに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-OVERFLOW-STRING ON OVERFLOW指定がない場合でもエラーとはならない。例外が検出される時点までの処理は実行されており,その時点までの実行結果は保証する。
EC-OVERFLOW-UNSTRING ON OVERFLOW指定がない場合でもエラーとはならない。例外が検出される時点までの処理は実行されており,その時点までの実行結果は保証する。
EC-PROGRAM EC-PROGRAMに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-PROGRAM-ARG-MISMATCH コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2
EC-PROGRAM-CANCEL-ACTIVE 実行時エラーで異常終了。
EC-PROGRAM-IMP コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2
EC-PROGRAM-NOT-FOUND コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2
EC-PROGRAM-RECURSIVE-CALL コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2
EC-PROGRAM-RESOURCES コンパイラオプションの指定状況やCALL文の書き方によって動作が異なる。※2
EC-RAISING EC-RAISINGに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-RAISING-NOT-SPECIFIED 実行時エラーで異常終了。
EC-RANGE EC-RANGEに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-RANGE-INSPECT-SIZE 実行時エラーで異常終了。
EC-RANGE-INVALID エラーとならないが,実行結果は保証しない。
EC-RANGE-PERFORM-VARYING エラーとならないが,実行結果は保証しない。
EC-RANGE-SEARCH-INDEX エラーとならないが,実行結果は保証しない。
EC-RANGE-SEARCH-NO-MATCH エラーとならないが,実行結果は保証しない。
EC-SIZE EC-SIZEに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-SIZE-EXPONENTIATION コンパイラオプションの指定状況やCOMPUTE文の書き方によって動作が異なる。※3
EC-SIZE-OVERFLOW エラーとならないが,ON SIZE ERROR, NOT ON SIZE ERROR指定がない場合の実行結果はけたあふれが発生している。なお,べき乗演算についてはコンパイラオプションの指定状況やCOMPUTE文の書き方によって動作が異なる。※3
EC-SIZE-TRUNCATION エラーとならないが,ON SIZE ERROR, NOT ON SIZE ERROR指定がない場合の実行結果はけたあふれが発生している。
EC-SIZE-UNDERFLOW エラーとならないが,ON SIZE ERROR, NOT ON SIZE ERROR指定がない場合の実行結果はけたあふれが発生している。なお,べき乗演算についてはコンパイラオプションの指定状況やCOMPUTE文の書き方によって動作が異なる。※3
EC-SIZE-ZERO-DIVIDE
  • -TDInfオプションなしの場合
    ON SIZE ERROR, NOT ON SIZE ERROR指定がない場合はアプリケーションエラー(ハードウェア例外)で異常終了。
  • -TDInfオプションありの場合
    ON SIZE ERROR,またはNOT ON SIZE ERROR指定がない場合は実行時エラーで異常終了。
EC-SORT-MERGE EC-SORT-MERGEに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-SORT-MERGE-IMP 実行時エラーで異常終了。
EC-SORT-MERGE-RELEASE 実行時エラーで異常終了。
EC-SORT-MERGE-RETURN 実行時エラーで異常終了。
EC-USER EC-USERに関連するレベル3の例外が発生した場合,おのおのに対応する動作となる。
EC-USER-(ユーザ定義例外名) エラーとならない。

注※1
メモリの状態によっては,ハードウェア例外となる場合があります。

注※2
動作の詳細については,「表22-6 EC-PROGRAMとコンパイラオプションの組み合わせによる動作の相違」を参照してください。

注※3
動作の詳細については,「表22-7 べき乗演算とコンパイラオプションの組み合わせによる動作の相違」を参照してください。

表22-6 EC-PROGRAMとコンパイラオプションの組み合わせによる動作の相違

例外名 -Compati85,Call
指定の有無
CALL文のON EXCEPTION または ON OVERFLOWの指定
あり なし
EC-PROGRAM-ARG-MISMATCH あり
  • -DebugCompatiありの場合
    実行時エラーで異常終了。
  • -DebugCompatiなしの場合
    エラーとはならないが,実行結果を保証しない場合がある(引数や返却項目の参照/設定の状態によっては,ハードウェア例外や実行結果不正となる場合がある)。
なし
  • -DebugCompatiありの場合
    指定された無条件文を実行。
  • -DebugCompatiなしの場合
    エラーとはならないが,実行結果を保証しない場合がある(引数や返却項目の参照/設定の状態によっては,ハードウェア例外や実行結果不正となる場合がある)。

  • -DebugCompatiありの場合
    実行時エラーで異常終了。
  • -DebugCompatiなしの場合
    エラーとはならないが,実行結果を保証しない場合がある(引数や返却項目の参照/設定の状態によっては,ハードウェア例外や実行結果不正となる場合がある)。
EC-PROGRAM-IMP あり
  • 実行可能ファイル呼び出し,またはDLLロード時に例外を検出した場合,指定された無条件文を実行。
  • 上記以外の場合,実行時エラーで異常終了。
実行時エラーで異常終了。
なし 指定された無条件文を実行。
EC-PROGRAM-NOT-FOUND あり 指定された無条件文を実行。 実行時エラーで異常終了。
なし
EC-PROGRAM-RECURSIVE-CALL あり 実行時エラーで異常終了。
なし 指定された無条件文を実行。 実行時エラーで異常終了。
EC-PROGRAM-RESOURCES あり 実行時エラーで異常終了。
なし 指定された無条件文を実行。 実行時エラーで異常終了。

表22-7 べき乗演算とコンパイラオプションの組み合わせによる動作の相違

種別 例外名 -Compati85,Power指定の有無 COMPUTE文のON SIZE ERRORの指定
あり なし
NOT ON SIZE ERROR NOT ON SIZE ERROR
あり なし あり なし
整数べき乗 EC-SIZE-EXPONENTIATION 底 :0
指数:0
あり NOT ON SIZEを実行。 エラーとならない。 NOT ON SIZEを実行。 エラーとならない。
なし ON SIZEを実行。 エラーとならない。
底 :0
指数:負
あり ON SIZEを実行。 エラーとならない。 実行時エラーで異常終了。
なし
浮動小数点べき乗 EC-SIZE-EXPONENTIATION 底 :0
指数:0
あり NOT ON SIZEを実行。 エラーとならない。 NOT ON SIZEを実行。 エラーとならない。
なし ON SIZEを実行。 エラーとならない。
底 :0
指数:負
あり NOT ON SIZEを実行。 エラーとならない。 NOT ON SIZEを実行。 エラーとならない。
なし ON SIZEを実行。 エラーとならない 実行時エラーで異常終了。
底 :負
指数:小数
あり ON SIZEを実行。 エラーとならない。 実行時エラーで異常終了。
なし
EC-SIZE-OVERFLOW あり NOT ON SIZEを実行。 エラーとならない。 NOT ON SIZEを実行。 エラーとならない。
なし ON SIZEを実行。 エラーとならない。
EC-SIZE-UNDERFLOW あり NOT ON SIZEを実行。 エラーとならない。 NOT ON SIZEを実行。 エラーとならない。
なし ON SIZEを実行。 エラーとならない。

注※
被べき数(底)が浮動小数点項目であるか,またはべき数(指数)が整数でない場合に演算の中間結果が浮動小数点形式となり,上表の浮動小数点べき乗演算となります。
これ以外は,演算の中間結果が整数形式となり,整数べき乗演算となります。
演算の中間結果の詳細については,「5.2.4 演算の中間結果」を参照してください。

(2) 伝播によって例外を検出した場合

伝播によって例外を検出した場合,CALL文,INVOKE文,および利用者定義関数の呼び出しで検出された例外名の例外チェックが無効なときは,例外の致命度によって,次に示す処理が実行されます。

表22-8 伝播によって検出した例外に対して例外チェックが無効な場合の動作

致命度 動作
致命的な例外 図22-5 プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行するが,プログラム「PARENTPROGRAM」の例外チェックが無効な場合の動作例」のように,制御遷移した文(CALL文,INVOKE文,および利用者定義関数の呼び出し)で,実行時エラーメッセージ(KCCC0402R-S)を出力し,実行単位が異常終了となる。
なお,例外を受け取れないプログラムの場合は,「図22-6 プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行しようとするが,プログラム「PARENTPROGRAM」が例外を受け取れない場合の動作例」のように,呼び出し先プログラム中の例外を検出した文で,実行時エラーメッセージ(KCCC0403R-S)を出力し,実行単位が異常終了となる。
非致命的な例外 図22-7 非致命的な例外のときは,例外の伝播は無視され,実行が継続される場合の動作例」のように,例外の伝播は無視され,実行が継続される。

注※
例外を受け取れないプログラムの詳細については,「22.5.3 例外を受け取れないプログラムに例外を伝播させた場合の動作」を参照してください。

例外の伝播によって検出された例外の詳細については,「表22-15 例外の伝播によって検出された例外」を参照してください。

図22-5 プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行するが,プログラム「PARENTPROGRAM」の例外チェックが無効な場合の動作例

[図データ]

  1. プログラム「PARENTPROGRAM」中のCALL文で,プログラム「CHILDPROGRAM」を呼び出します。
  2. プログラム「CHILDPROGRAM」のDIVIDE文で,ゼロによる除算の例外が検出されます(例外名:EC-SIZE-ZERO-DIVIDE)。
  3. PROPAGATE指令がONなので,プログラム「PARENTPROGRAM」のCALL文に致命的な例外が伝播します。
  4. プログラム「PARENTPROGRAM」中で,伝播された致命的な例外(例外名:EC-SIZE-ZERO-DIVIDE)に対する例外チェックが無効なので,CALL文で実行時エラーメッセージ(KCCC0402R-S:「伝播により例外が検出されました。」)を出力し,プログラムが異常終了します。

    図22-6 プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行しようとするが,プログラム「PARENTPROGRAM」が例外を受け取れない場合の動作例

    [図データ]

 
  1. プログラム「PARENTPROGRAM」中のCALL文で,プログラム「CHILDPROGRAM」を呼び出します。
  2. プログラム「CHILDPROGRAM」中のDIVIDE文で,ゼロによる除算の例外が検出されます(例外名:EC-SIZE-ZERO-DIVIDE)。
  3. PROPAGATE指令がONになっていますが,プログラム「PARENTPROGRAM」が例外を受け取れないプログラムなので,致命的な例外が伝播できません。そのため,プログラム「CHILDPROGRAM」の例外を検出した文(DIVIDE文)で実行時エラーメッセージ(KCCC0403R-S:「例外を伝播できません。」)を出力し,プログラムが異常終了します。

注※
この場合の例外を受け取れないプログラムとは,次の条件がすべて重なった場合を指します。
  1. プログラム中にON指定のあるPROPAGATE指令が書かれていない。
  2. プログラム中にTURN指令が一つも書かれていない。
  3. 宣言節中のUSE文にEXCEPTION OBJECT指定が一つもない。
  4. CALL文にON OVERFLOW指定,ON EXCEPTION指定,NOT ON EXCEPTION指定がない。
例外を受け取れないプログラムの詳細については,「22.5.3 例外を受け取れないプログラムに例外を伝播させた場合の動作」を参照してください。

図22-7 非致命的な例外のときは,例外の伝播は無視され,実行が継続される場合の動作例

[図データ]
  1. プログラム「PARENTPROGRAM」中のCALL文で,プログラム「CHILDPROGRAM」を呼び出します。
  2. プログラム「CHILDPROGRAM」中のSEARCH文で,指標名の範囲外による例外が検出されます(例外名:EC-RANGE-SEARCH-INDEX)。
  3. PROPAGATE指令がONになっていますが,非致命的な例外のときは,例外の伝播は無視され,実行が継続されます。