プログラム・エラー処理サブルーチンの使用

プログラム・エラーまたは例外を処理するためには、プログラム・エラー処理 サブルーチン (*PSSR) を作成することができます。 プログラム・エラーが起こると、次のようになります。
  1. プログラム状況データ構造が更新されます。
  2. 命令コードの 73 ~ 74 桁目に標識が指定されていない 場合には、 エラーが処理され、制御が *PSSR に移されます。

    ファイル仕様書でキーワード INFSR の後に *PSSR を指定することによって、 ファイル・エラーの後でプログラム・エラー処理サブルーチンに明示的に制御を渡すことができます。

モジュールのプロシージャーのどれか (あるいはすべて) に *PSSR をコーディングすることができます。 各 *PSSR は、それがコーディングされているプロシージャーに固有です。

プログラムに *PSSR エラー処理サブルーチンを追加するためには、 次のステップを行ってください。
  1. 定義仕様書の 23 桁目に S を指定することによって、任意指定でプログラム 状況データ構造 (PSDS) を指定してください。
  2. *PSSR の演算項目 1 で BEGSR 命令を指定してください。
  3. 戻り点がある場合にはそれを指定して、サブルーチンの ENDSR 命令にそれを コーディングしてください。 サブプロシージャーでは、演算項目 2 はブランクでなければなりません。 演算項目 2 の有効な項目については、ENDSR 命令での戻り点の指定を参照してくださ い。
  4. プログラム・エラー処理サブルーチンの残りをコーディングしてください。 プログラム・エラー処理サブルーチンでは、どんな ILE RPG コンパイラー命令でも使用することができます。ENDSR 命令は、 プログラム・エラー処理サブルーチンの最後の仕様書でなければなりません。

図 1 には、 サイクル・メイン・プロシージャーのプログラム・エラー処理サブルーチンの例を示して あります。

図 1. サイクル・メイン・プロシージャーの *PSSR サブルーチンの例
      *-----------------------------------------------------------------*
      *  プログラム状況データ構造の対応する部分を定義します。           *
      *-----------------------------------------------------------------*
     D Psds           SDS
     D  Loc              *ROUTINE
     D  Err              *STATUS
     D  Parms            *PARMS
     D  Name             *PROC
      *-----------------------------------------------------------------*
      *  コーディングの本体部分
      *  ゼロによる除算が行なわれるとエラーが発生します。
      *  *PSSR サブルーチンに制御が渡されます。
      *-----------------------------------------------------------------*
      *=================================================================*
      * *PSSR: メイン・プロシージャーのエラー処理サブルーチン。状況が
      *        102 であるかどうかをチェックすることにより、ゼロによる
      *        除算エラーをチェックします。エラーがあれば、除数に 1 を
      *        加算し、*GETIN を ReturnPt に転送して続行します。
      *=================================================================*
     C     *PSSR         BEGSR
     C                   IF        Err = 102
     C                   ADD       1             Divisor
     C                   MOVE      '*GETIN'      ReturnPt          6
      *-----------------------------------------------------------------*
      *       予期しないエラーが起こったため、
      *       *CANCL を ReturnPt に転送してプロシージャーを終了させます。
      *-----------------------------------------------------------------*
     C                   ELSE
     C                   MOVE      '*CANCL'      ReturnPt
     C                   ENDIF
     C                   ENDSR     ReturnPt

プログラム状況データ構造は、定義仕様書で定義されます。 事前定義のサブフィールドの *STATUS, *ROUTINE, *PARMS, および *PROGRAM が指定され、 各サブフィールドには名前が割り当てられています。

*PSSR エラー処理サブルーチンは、演算仕様書でコーディングされています。 プログラム・エラーが起こると、ILE RPG は制御を *PSSR エラー処理サブルーチンに渡します。 このサブルーチンは、除数がゼロの除算命令が原因で例外が起こったかどうかを判別します。 そうであった場合には、除数 (Divisor) に 1 が加算され、 フィールド ReturnPt にリテラル ‘*DETC’ が転送され、 明細演算ルーチンの始めからプログラムが処理を再開することを示します。

例外がゼロによる除算でなかった場合には、リテラル ‘*CANCL’ が フィールド ReturnPt に転送され、プロシージャーが終了します。

図 2 および 図 3 では、 サブプロシージャーの類似したプログラム・エラー処理サブルーチンを コーディングする方法を示しています。1 つの例として、GOTO を、 他の例としては、RETURN 命令をコーディングします。

図 2. GOTO のある *PSSR サブルーチンのサブプロシージャーの例
      *-----------------------------------------------------------------*
      *  サブプロシージャー定義の開始
      *-----------------------------------------------------------------*
     P SubProc         B
     D SubProc         PI             5P 0
      ...
      *-----------------------------------------------------------------*
      *  回復コードを含むコーディング本体
      *-----------------------------------------------------------------*
     C      TryAgain     TAG
     C      X            DIV       Divisor       Result
     C                   Return    Result
      *-----------------------------------------------------------------*
      *  ゼロによる除算が行なわれるとエラーが発生します。
      *  *PSSR サブルーチンに制御が渡されます。
      *-----------------------------------------------------------------*
     C     *PSSR         BEGSR
      *-----------------------------------------------------------------*
      * これがゼロによる除算のエラーの場合は、除数に 1 を加算して、
      * 再試行します。
      *-----------------------------------------------------------------*
     C                   IF        Err = 102
     C                   ADD       1             Divisor
     C                   GOTO      TryAgain
     C                   ENDIF
      *-----------------------------------------------------------------*
      * 制御が ENDSR に達すると、プロシージャーは正常に実行されません。
      *-----------------------------------------------------------------*
     C                   ENDSR
     P                 E
図 3. RETURN のある *PSSR サブルーチンのサブプロシージャーの例
      *-----------------------------------------------------------------*
      *  サブプロシージャー定義の開始
      *-----------------------------------------------------------------*
     P SubProc         B
     D SubProc         PI             5P 0
      ...
      *-----------------------------------------------------------------*
      *  除算命令を含むコーディング本体
      *-----------------------------------------------------------------*
     C      X            DIV       Divisor       Result
     C                   Return    Result
      *-----------------------------------------------------------------*
      *  ゼロによる除算が行なわれるとエラーが発生します。
      *  *PSSR サブルーチンに制御が渡されます。
      *-----------------------------------------------------------------*
     C     *PSSR         BEGSR
      *-----------------------------------------------------------------*
      * これがゼロによる除算エラーの場合、サブプロシージャーから
      * 0 が戻されます。
      *-----------------------------------------------------------------*
     C                   IF        Err = 102
     C                   RETURN    0
     C                   ENDIF
      *-----------------------------------------------------------------*
      * 制御が ENDSR に達すると、プロシージャーは正常に実行されません。
      *-----------------------------------------------------------------*
     C                   ENDSR
     P                 E