21.5.3 例外を受け取れないプログラムに例外を伝播させた場合の動作

<この項の構成>
(1) 例外を受け取れないプログラム
(2) 呼び出し元プログラムが例外を受け取れない場合の動作

(1) 例外を受け取れないプログラム

CALL文,INVOKE文,および利用者定義関数によって呼び出されたプログラム(例外を送る側)で例外が発生し,呼び出し元プログラム(例外を受け取る側)へ例外の伝播を実行しようとしても,呼び出し元プログラムが例外を受け取れない場合,例外は伝播しません。

例外を受け取れる呼び出し元プログラム,例外を受け取れない呼び出し元プログラムの条件を次に示します。

条件プログラム種別/指定
COBOL
85
COBOL2002COBOL
以外の言語
-Compati85,NoPropagate指定なし※1-Compati85,NoPropagate指定あり※1
伝播抑止条件※2左記以外伝播抑止条件※2左記以外
例外を受け取る文オブジェクト指向のINVOKE文×××
利用者定義関数を参照する文×××
CALL文無条件指定なし※3××××
無条件指定あり※3×※4××
(凡例)
○:例外を受け取れる
×:例外を受け取れない
-:該当しない

注※1
例外の伝播を抑止するコンパイラオプションについては,「32.5.12 他システムとの移行の設定」の「(2) -Compati85オプション」を参照してください。
注※2
次の条件が重なった場合,例外の伝播を抑止します。
  1. プログラム中にON指定のあるPROPAGATE指令が書かれていない。
  2. プログラム中にTURN指令が一つも書かれていない。
    ただし上記の1.~2.では,入れ子のプログラムや複数の最外側のプログラムが書かれたソースで,該当するプログラムの前にON指定のあるPROPAGATE指令や有効なTURN指令がある場合,それ以降に定義されたすべてのプログラムは,例外の伝播を抑止する対象にはなりません。
  3. 宣言節中のUSE文にEXCEPTION OBJECT指定が一つもない。
注※3
ON OVERFLOW指定,ON EXCEPTION指定,NOT ON EXCEPTION指定
注※4
呼び出されたプログラム(例外を送る側)で例外が発生し,呼び出し元プログラム(例外を受け取る側)へ例外を伝播する場合,CALL文の無条件文は実行されません。詳細については,マニュアル「COBOL2002 言語 標準仕様編 10.8.4(3) 一般規則」を参照してください。

(2) 呼び出し元プログラムが例外を受け取れない場合の動作

呼び出し元プログラムが例外を受け取れない場合,呼び出し先プログラムで例外が検出されたときの動作が異なります。

例外が検出されたときの動作の詳細については,「21.8.3 例外処理の動作」を参照してください。

例外を受け取れないプログラムへ例外の伝播を実行しようとした場合の例を次に示します。

<主プログラム:SAMPLE1.CBL(COBOL85で作成したプログラム)>

      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE1.
          :
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 PARAM USAGE COMP-1 VALUE +9.9E+01.
          :
      PROCEDURE DIVISION.
          CALL 'SAMPLE2' USING PARAM. *> 1.
      END PROGRAM SAMPLE1.

<副プログラム:SAMPLE2.CBL(COBOL2002で作成したプログラム)>

      >>PROPAGATE ON
      IDENTIFICATION DIVISION.
      PROGRAM-ID. SAMPLE2.
          :
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 ANS USAGE COMP-1.
      01 DATA-A PIC X(21) VALUE '100300700800400600900'.
      01 DATA-B REDEFINES DATA-A.
         02 DATA-C PIC 9(3) OCCURS 7 TIMES
                   INDEXED BY DATA-D DATA-E.
      LINKAGE SECTION.
      01 PARAM USAGE COMP-1.
          :
      PROCEDURE DIVISION USING PARAM.
          SET DATA-D DATA-E TO 0.
      >>TURN EC-RANGE-SEARCH-INDEX CHECKING ON
          SEARCH DATA-C VARYING DATA-E      *>2.
              WHEN  DATA-C(DATA-E) > 1500
                  CONTINUE
          END-SEARCH.
      >>TURN EC-ARGUMENT-FUNCTION CHECKING ON
          COMPUTE ANS = FUNCTION ACOS ( PARAM ). *> 3.
          DISPLAY 'ANSWER  =' ANS.
      END PROGRAM SAMPLE2.

  1. プログラム「SAMPLE1」中のCALL文で,プログラム「SAMPLE2」を呼び出します。
  2. PROPAGATE指令がONになっていますが,プログラム「SAMPLE2」中のSEARCH文で検出した例外が非致命的な例外のため,例外は伝播されず次の文(COMPUTE文)へ実行が継続されます。
  3. COMPUTE文で致命的な例外が検出され,かつ,PROPAGATE指令がONになっていますが,プログラム「SAMPLE1」は例外を受け取れないため,例外は伝播しません。この場合,実行時エラーメッセージ(KCCC0403R-S:「例外を伝播できません。」)を出力し,プログラム「SAMPLE2」が異常終了します。