21.3.3 例外チェックが無効な場合の動作
(1) 手続き文の実行中にエラーが発生し,例外を検出した場合
手続き文でエラーが発生して例外を検出した際に,該当する例外チェックが無効な場合は,検出された例外,コンパイラオプションの指定,および例外が検出された文に対する無条件文の指定によって,動作が異なります。
共通例外処理で取り扱える例外名について,例外チェックが無効な場合の動作を,次に示します。
例外名 |
-Compati85,Call 指定の有無 |
CALL文のON EXCEPTION または ON OVERFLOWの指定 |
|
---|---|---|---|
あり |
なし |
||
EC-PROGRAM-ARG-MISMATCH |
あり |
|
|
なし |
|
|
|
EC-PROGRAM-IMP |
あり |
|
実行時エラーで異常終了。 |
なし |
指定された無条件文を実行。 |
||
EC-PROGRAM-NOT-FOUND |
あり |
指定された無条件文を実行。 |
実行時エラーで異常終了。 |
なし |
|||
EC-PROGRAM-RECURSIVE-CALL |
あり |
実行時エラーで異常終了。 |
|
なし |
指定された無条件文を実行。 |
実行時エラーで異常終了。 |
|
EC-PROGRAM-RESOURCES |
あり |
実行時エラーで異常終了。 |
|
なし |
指定された無条件文を実行。 |
実行時エラーで異常終了。 |
種別※ |
例外名 |
-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を実行。 |
エラーとならない。 |
(2) 伝播によって例外を検出した場合
伝播によって例外を検出した場合,CALL文,INVOKE文,および利用者定義関数の呼び出しで検出された例外名の例外チェックが無効なときは,例外の致命度によって,次に示す処理が実行されます。
致命度 |
動作 |
---|---|
致命的な例外 |
「図21‒5 プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行するが,プログラム「PARENTPROGRAM」の例外チェックが無効な場合の動作例」のように,制御遷移した文(CALL文,INVOKE文,および利用者定義関数の呼び出し)で,実行時エラーメッセージ(KCCC0402R-S)を出力し,実行単位が異常終了となる。 なお,例外を受け取れないプログラム※の場合は,「図21‒6 プログラム「CHILDPROGRAM」から致命的な例外の伝播を実行しようとするが,プログラム「PARENTPROGRAM」が例外を受け取れない場合の動作例」のように,呼び出し先プログラム中の例外を検出した文で,実行時エラーメッセージ(KCCC0403R-S)を出力し,実行単位が異常終了となる。 |
非致命的な例外 |
「図21‒7 非致命的な例外のときは,例外の伝播は無視され,実行が継続される場合の動作例」のように,例外の伝播は無視され,実行が継続される。 |
例外の伝播によって検出された例外の詳細については,「表21‒15 例外の伝播によって検出された例外」を参照してください。
-
プログラム「PARENTPROGRAM」中のCALL文で,プログラム「CHILDPROGRAM」を呼び出します。
-
プログラム「CHILDPROGRAM」のDIVIDE文で,ゼロによる除算の例外が検出されます(例外名:EC-SIZE-ZERO-DIVIDE)。
-
PROPAGATE指令がONなので,プログラム「PARENTPROGRAM」のCALL文に致命的な例外が伝播します。
-
プログラム「PARENTPROGRAM」中で,伝播された致命的な例外(例外名:EC-SIZE-ZERO-DIVIDE)に対する例外チェックが無効なので,CALL文で実行時エラーメッセージ(KCCC0402R-S:「伝播により例外が検出されました。」)を出力し,プログラムが異常終了します。
-
プログラム「PARENTPROGRAM」中のCALL文で,プログラム「CHILDPROGRAM」を呼び出します。
-
プログラム「CHILDPROGRAM」中のDIVIDE文で,ゼロによる除算の例外が検出されます(例外名:EC-SIZE-ZERO-DIVIDE)。
-
PROPAGATE指令がONになっていますが,プログラム「PARENTPROGRAM」が例外を受け取れないプログラム※なので,致命的な例外が伝播できません。そのため,プログラム「CHILDPROGRAM」の例外を検出した文(DIVIDE文)で実行時エラーメッセージ(KCCC0403R-S:「例外を伝播できません。」)を出力し,プログラムが異常終了します。
- 注※
-
この場合の例外を受け取れないプログラムとは,次の条件がすべて重なった場合を指します。
-
プログラム中にON指定のあるPROPAGATE指令が書かれていない。
-
プログラム中にTURN指令が一つも書かれていない。
-
宣言節中のUSE文にEXCEPTION OBJECT指定が一つもない。
-
CALL文にON OVERFLOW指定,ON EXCEPTION指定,NOT ON EXCEPTION指定がない。
例外を受け取れないプログラムの詳細については,「21.5.3 例外を受け取れないプログラムに例外を伝播させた場合の動作」を参照してください。
-
-
プログラム「PARENTPROGRAM」中のCALL文で,プログラム「CHILDPROGRAM」を呼び出します。
-
プログラム「CHILDPROGRAM」中のSEARCH文で,指標名の範囲外による例外が検出されます(例外名:EC-RANGE-SEARCH-INDEX)。
-
PROPAGATE指令がONになっていますが,非致命的な例外のときは,例外の伝播は無視され,実行が継続されます。