プログラム・エラー処理サブルーチンの使用
- プログラム状況データ構造が更新されます。
- 命令コードの 73 ~ 74 桁目に標識が指定されていない 場合には、
エラーが処理され、制御が *PSSR に移されます。
ファイル仕様書でキーワード INFSR の後に *PSSR を指定することによって、 ファイル・エラーの後でプログラム・エラー処理サブルーチンに明示的に制御を渡すことができます。
モジュールのプロシージャーのどれか (あるいはすべて) に *PSSR をコーディングすることができます。 各 *PSSR は、それがコーディングされているプロシージャーに固有です。
- 定義仕様書の 23 桁目に S を指定することによって、任意指定でプログラム 状況データ構造 (PSDS) を指定してください。
- *PSSR の演算項目 1 で BEGSR 命令を指定してください。
- 戻り点がある場合にはそれを指定して、サブルーチンの ENDSR 命令にそれを コーディングしてください。 サブプロシージャーでは、演算項目 2 はブランクでなければなりません。 演算項目 2 の有効な項目については、ENDSR 命令での戻り点の指定を参照してくださ い。
- プログラム・エラー処理サブルーチンの残りをコーディングしてください。 プログラム・エラー処理サブルーチンでは、どんな ILE RPG コンパイラー命令でも使用することができます。ENDSR 命令は、 プログラム・エラー処理サブルーチンの最後の仕様書でなければなりません。
図 1 には、 サイクル・メイン・プロシージャーのプログラム・エラー処理サブルーチンの例を示して あります。
*-----------------------------------------------------------------*
* プログラム状況データ構造の対応する部分を定義します。 *
*-----------------------------------------------------------------*
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 命令をコーディングします。
*-----------------------------------------------------------------*
* サブプロシージャー定義の開始
*-----------------------------------------------------------------*
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
*-----------------------------------------------------------------*
* サブプロシージャー定義の開始
*-----------------------------------------------------------------*
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