ファイル例外/エラー処理サブルーチン (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
- ブランク
ファイル例外/エラー処理サブルーチンの指定にあたっては、以下の点に留意し
てください。
- プログラマーは、EXSR 命令の演算項目 2 にサブルーチンの名前を指定するこ
とによって、ファイル例外/エラー処理サブルーチンを明示的に呼び出すことがで
きます。
- ファイル例外/エラー処理サブルーチンの ENDSR
命令が実行された後に、RPG IV 言語では、演算項目 2
に指定されたフィールドまたは配列要素がブランクにリセットされます。
したがって、サブルーチンの処理中にプログラマーがこのフィールドに値を入れなかった場合、サブルーチンが
EXSR 命令によって呼び出されたのでなければ、そのサブルーチンの処理後に RPG IV
のデフォルトのエラー処理プログラムが制御を受け取ります。演算項目 2 はブランクに設定される
ので、プログラマーは、発生した例外/エラーに最も適したサブルーチンの中の戻り点を指定することができます。 サブルーチン
が EXSR 命令によって呼び出され、ENDSR 命令の演算項目 2 がブラ
ンクの場合には、その ENDSR 命令の後の次の順次命令に制御が戻されます。 ファ
イル例外/エラー処理サブルーチンでは、複数のファイルのエラーを処理すること
ができます。
- ファイルの例外/エラーがプログラムの開始時または終了時に起こった場合には、RPG IV
のデフォルトのエラー処理プログラムに制御が渡され、ユーザー作成のファイル例外/エラーまたはサブルーチン
(INFSR) へは渡されません。
- ファイル例外/エラーが起こった場合にはいつでもファイル例外/エラー処理サブルーチンが制御を受け取ることができるので、エラーのあるファイルについ
て入出力操作が処理されていた場合には、サブルーチンの実行中に例外/エラー
が起こることがあります。 サブルーチンの実行中にすでにエラーになっているフ
ァイルで例外/エラーが起こった場合には、サブルーチンが再び呼び出されます。この結果、
プログラマーがこの問題を避けるようにサブルーチンをコーディングしていなけ
れば、プログラムのループとなります。 このようなプログラム・ループを避ける
1 つの方法として、初回のスイッチをサブルーチンで設定する方法があります
。 このサブルーチンを初めて通るのではない場合には、停止標識をオンに設定して、次のような RETURN 命令を出してください。
図 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 命令を出すことが必要な場合があります。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.