COBOL2002 使用の手引 手引編


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

〈この項の構成〉

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

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

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

表21‒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

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

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

注※3

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

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

例外名

-Compati85,Call

指定の有無

CALL文のON EXCEPTION または ON OVERFLOWの指定

あり

なし

EC-PROGRAM-ARG-MISMATCH

あり

  • -DebugCompatiありの場合

    実行時エラーで異常終了。

  • -DebugCompatiなしの場合

    エラーとはならないが,実行結果を保証しない場合がある(引数や返却項目の参照/設定の状態によっては,シグナル発生による異常終了や実行結果不正となる場合がある)。

なし

  • -DebugCompatiありの場合

    指定された無条件文を実行。

  • -DebugCompatiなしの場合

    エラーとはならないが,実行結果を保証しない場合がある(引数や返却項目の参照/設定の状態によっては,シグナル発生による異常終了や実行結果不正となる場合がある)。

  • -DebugCompatiありの場合

    実行時エラーで異常終了。

  • -DebugCompatiなしの場合

    エラーとはならないが,実行結果を保証しない場合がある(引数や返却項目の参照/設定の状態によっては,シグナル発生による異常終了や実行結果不正となる場合がある)。

EC-PROGRAM-IMP

あり

  • 実行可能ファイル呼び出し,または共用ライブラリロード時に例外を検出した場合,指定された無条件文を実行。

  • 上記以外の場合,実行時エラーで異常終了。

実行時エラーで異常終了。

なし

指定された無条件文を実行。

EC-PROGRAM-NOT-FOUND

あり

指定された無条件文を実行。

実行時エラーで異常終了。

なし

EC-PROGRAM-RECURSIVE-CALL

あり

実行時エラーで異常終了。

なし

指定された無条件文を実行。

実行時エラーで異常終了。

EC-PROGRAM-RESOURCES

あり

実行時エラーで異常終了。

なし

指定された無条件文を実行。

実行時エラーで異常終了。

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

種別※1

例外名

-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

指数:負

あり※2

NOT ON SIZEを実行。

エラーとならない。

NOT ON SIZEを実行。

エラーとならない。

あり※3

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を実行。

エラーとならない。

注※1

被べき数(底)が浮動小数点項目であるか,またはべき数(指数)が整数でない場合に演算の中間結果が浮動小数点形式となり,上表の浮動小数点べき乗演算となります。

これ以外は,演算の中間結果が整数形式となり,整数べき乗演算となります。

演算の中間結果の詳細については,「5.2.4 演算の中間結果」を参照してください。

注※2 AIXの場合。

注※3 Linuxの場合。

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

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

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

致命度

動作

致命的な例外

図21‒5 プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行するが,プログラム「PARENTPROGRAM」の例外チェックが無効な場合の動作例」のように,制御遷移した文(CALL文,INVOKE文,および利用者定義関数の呼び出し)で,実行時エラーメッセージ(KCCC0402R-S)を出力し,実行単位が異常終了となる。

なお,例外を受け取れないプログラムの場合は,「図21‒6 プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行しようとするが,プログラム「PARENTPROGRAM」が例外を受け取れない場合の動作例」のように,呼び出し先プログラム中の例外を検出した文で,実行時エラーメッセージ(KCCC0403R-S)を出力し,実行単位が異常終了となる。

非致命的な例外

図21‒7 非致命的な例外のときは,例外の伝播は無視され,実行が継続される場合の動作例」のように,例外の伝播は無視され,実行が継続される。

注※

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

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

図21‒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:「伝播により例外が検出されました。」)を出力し,プログラムが異常終了します。

図21‒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指定がない。

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

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

[図データ]

  1. プログラム「PARENTPROGRAM」中のCALL文で,プログラム「CHILDPROGRAM」を呼び出します。

  2. プログラム「CHILDPROGRAM」中のSEARCH文で,指標名の範囲外による例外が検出されます(例外名:EC-RANGE-SEARCH-INDEX)。

  3. PROPAGATE指令がONになっていますが,非致命的な例外のときは,例外の伝播は無視され,実行が継続されます。