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

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

例外/エラーが暗黙の (1 次または 2 次) ファイル操作で起こった場合、あるいは 73 から 74 桁目に標識が指定されておらず、(E) 拡張を持たず、かつそのエラーを処理できる MONITOR グループの監視グループ内にもない、明示のファイル操作で起こった場合には、ファイル例外/エラー処理サブルーチン (INFSR) が制御を受け取ります。ファイル例外/エラー処理サブルーチンは、EXSR 命令コードによって実行すること もできます。 RPG IV の命令は、すべてファイル例外/エラー処理サブルーチンの中で使用することができます。BEGSR 命令の演算項目 1 および EXSR 命令の演算項目 2 には、制御 を受け取るサ ブルーチンの名前 (ファイル仕様書で INFSR キーワードによって指定された のと同じ名前) が入っていなければなりません。
注: キーワード MAIN または NOMAIN が制御仕様書に指定されている場合、あるいはサブプロシージャーがファイルにアクセスする場合には、INFSR キーワードを指定することはできません。 プロシージャー内のファイルに関するエラーを処理する場合、入出力操作ごとにエラーを処理するには (E) 拡張を使用し、複数の操作についてエラーを処理するには MONITOR グループを使用します。 MONITOR グループの ON-ERROR セクションからサブプロシージャーを呼び出して、さらに詳細なエラー処理を実行することもできます。
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
ブランク
ファイル例外/エラー処理サブルーチンの指定にあたっては、以下の点に留意し てください。
  • プログラマーは、EXSR 命令の演算項目 2 にサブルーチンの名前を指定するこ とによって、ファイル例外/エラー処理サブルーチンを明示的に呼び出すことがで きます。
  • ファイル例外/エラー処理サブルーチンの ENDSR 命令が実行された後に、RPG IV 言語では、演算項目 2 に指定されたフィールドまたは配列要素がブランクにリセットされます。 したがって、サブルーチンの処理中にプログラマーがこのフィールドに値を入れなかった場合、サブルーチンが EXSR 命令によって呼び出されたのでなければ、そのサブルーチンの処理後に RPG IV のデフォルトのエラー処理プログラムが制御を受け取ります。演算項目 2 はブランクに設定される ので、プログラマーは、発生した例外/エラーに最も適したサブルーチンの中の戻り点を指定することができます。 サブルーチン が EXSR 命令によって呼び出され、ENDSR 命令の演算項目 2 がブラ ンクの場合には、その ENDSR 命令の後の次の順次命令に制御が戻されます。 ファ イル例外/エラー処理サブルーチンでは、複数のファイルのエラーを処理すること ができます。
  • ファイルの例外/エラーがプログラムの開始時または終了時に起こった場合には、RPG IV のデフォルトのエラー処理プログラムに制御が渡され、ユーザー作成のファイル例外/エラーまたはサブルーチン (INFSR) へは渡されません。
  • ファイル例外/エラーが起こった場合にはいつでもファイル例外/エラー処理サブルーチンが制御を受け取ることができるので、エラーのあるファイルについ て入出力操作が処理されていた場合には、サブルーチンの実行中に例外/エラー が起こることがあります。 サブルーチンの実行中にすでにエラーになっているフ ァイルで例外/エラーが起こった場合には、サブルーチンが再び呼び出されます。この結果、 プログラマーがこの問題を避けるようにサブルーチンをコーディングしていなけ れば、プログラムのループとなります。 このようなプログラム・ループを避ける 1 つの方法として、初回のスイッチをサブルーチンで設定する方法があります 。 このサブルーチンを初めて通るのではない場合には、停止標識をオンに設定して、次のような RETURN 命令を出してください。
図 1. 初回のスイッチの設定
*...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 命令を出すことが必要な場合があります。