ファイル例外/エラー処理サブルーチン (INFSR)

ファイル例外/エラーの後で制御を受け取ることができる、ユーザー作成の RPG IV サブルーチンを識別するためには、このファイルで例外/エラーが起こった時に制御を受け取るサブルーチンの名前を持つ INFSR キーワードをファイル仕様書に指定してください。サブルーチン名は、このファイルの例外/エラーについてはプログラム例外/エラー処理サブルーチンに制御が与えられることを指示する *PSSR とすることができます。

例外/エラーが暗黙の (1 次または 2 次) ファイル操作で起こった場合、あるいは 73 から 74 桁目に標識が指定されておらず、(E) 拡張を持たず、かつそのエラーを処理できる MONITOR グループの監視グループ内にもない、明示のファイル操作で起こった場合には、ファイル例外/エラー処理サブルーチン (INFSR) が制御を受け取ります。ファイル例外/エラー処理サブルーチンは、EXSR 命令コードによって実行すること もできます。 RPG IV の命令は、すべてファイル例外/エラー処理サブルーチンの中で使用することができます。BEGSR 命令の演算項目 1 および EXSR 命令の演算項目 2 には、制御 を受け取るサ ブルーチンの名前 (ファイル仕様書で INFSR キーワードによって指定された のと同じ名前) が入っていなければなりません。

注:
キーワード NOMAIN が制御仕様書に指定されていたり、あるいは そのファイルがサブプロシージャーによってアクセスされる場合 には、INFSR キーワードを指定することはできません。

ENDSR 命令はファイル例外/エラー処理サブルーチン中の最後の指定であり、 次のように指定しなければなりません。

位置
記入
6
C
7 から 11
ブランク
12 から 25
サブルーチン内の GOTO 指定で使用するラベルを入れることができます。
26 から 35
ENDSR
36 から 49
任意指定の記入項目で、サブルーチンの処理後に制御が戻される地点を指定 します。 この記入項目は 6 桁の文字フィールド、リテラル、または配列要素でな ければならず、その値によって以下の戻り点の 1 つが指定されます。
注:
戻り点をリテラルとして指定する場合には、アポストロフィで囲む必要が あります。 名前付き定数として指定する場合には、その定数は文字で、 先行ブランクのない戻り点だけが含まれていることが必要です。フィールド または配列要素の中に指定する場合には、フィールドまたは配列要素 の中で値を左寄せしなければなりません。
*DETL
明細行の先頭に続きます。
*GETIN
入力レコードの入手ルーチンに続きます。
*TOTC
合計演算の先頭に続きます。
*TOTL
合計行の先頭に続きます。
*OFL
オーバーフロー行の先頭に続きます。
*DETC
明細演算の先頭に続きます。
*CANCL
プログラムの処理を取り消します。
ブランク
RPG IV のデフォルトのエラー処理プログラムへ制御を戻します。演算項目 2 が ブランクの値および演算項目 2 が指定されていない場合でも、これ が適用されます。 サブルーチンが EXSR 命令によって呼び出され、演算項目 2 が ブランクであった場合には、次の順次命令に制御が戻されます。 ブランクは実行時にのみ有効です。
50 から 76
ブランク

ファイル例外/エラー処理サブルーチンの指定にあたっては、以下の点に留意し てください。

図 35. 初回のスイッチの設定
*...1....+....2....+....3....+....4....+....5....+....6....+....7...

CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..

C* INFSR がすでにエラーを処理している場合には、終了します。

C     ERRRTN        BEGSR

C     SW            IFEQ      '1'

C                   SETON                                        H1

C                   RETURN

C* それ以外の場合には、エラー処理プログラムにフラグを付けます。

C                   ELSE

C                   MOVE      '1'           SW

C                     :

C                     :

C                     :

C                   ENDIF

C* エラー処理を終了します。

C                   MOVE      '0'           SW

C                   ENDSR
注:
入出力エラーが起こった後は、ファイルの処理を続行することができなく なることがあります。続行するためには、そのファイルに対して CLOSE 命令を出 してから、OPEN 命令を出すことが必要な場合があります。