ILE RPG 例外処理
ILE RPG は、次の 4 つの例外処理メカニズムを提供します。
- エラー標識、または 'E' 命令コード拡張処理プログラム
- MONITOR グループ
- エラー処理サブルーチン処理プログラム
- デフォルトの例外処理プログラム
RPG では例外はプログラムとファイルの 2 つに分類されています。これによっ
て呼び出されるエラー処理サブルーチンのタイプが決定されます。 プログラム例外の例として、ゼロによる除算、範囲外配列指標、負数の
SQRT があります。ファイル例外の例としては未定義のレコード・タイプや装置エラーなどがあり
ます。
RPG が例外を処理するように指示する方法は 5 つあります。
それらは次のとおりです。
- 該当する命令コードの演算仕様書の 73 〜 74 桁目にエラー標識を指定する。
- 適切な命令コードに命令コード拡張 'E' を
指定する。
- 例外を生成するコードを MONITOR
グループの中に組み込む。
- ファイル例外について、ファイル仕様書の INFSR キーワードによって定義さ
れるファイル・エラー処理サブルーチンをコーディングする。 ファイル・エラー処理サブルーチンは、メイン・ソース・セクションでしか
コーディングすることはできません。 サブプロシージャーで使用されたファイルには INFSR をコーディングすること
はできません。
- プログラム例外について、*PSSR という名前の
プログラム・エラー処理サブルーチンをコーディングする。*PSSR は、それがコーディングされているプロシージャーに対して固有で
あることに注意してください。 これはメイン・プロシージャーの *PSSR が、メイン・プロシージャーに関連した
プログラム・エラーだけを処理することを意味しています。 同様に、サブプロシージャーの *PSSR はサブプロシージャーのエラーだけを処
理します。
メイン・プロシージャー内の例外処理プログラム
例外がメイン・プロシージャーで起こると ILE RPG は次のことを行います。
- 演算仕様書にエラー標識が指定されていて、例外がその命令で予期される
ものである場合:
- 標識をオンに設定する。
- 例外を処理する。
- 制御は次の ILE RPG 命令で再開する。
- 'E' 命令コード拡張が演算仕様書上にあり、この例外がその命令で
予期される場合。
- 組み込み関数 %STATUS および %ERROR の戻り値が設定される。
注:
'E' 拡張が指定されていなくても何か例外が発生すると、%STATUS は
設定されます。
- 例外を処理する。
- 制御は次の ILE RPG 命令で再開する。
- エラー標識も 'E' 拡張もなく、例外を生成するコードが MONITOR グループの
MONITOR ブロックにある場合は、制御は MONITOR
グループ内の ON-ERROR セクションに渡されます。
- エラー標識または 'E' 拡張がなく、例外を処理できる活動状態の
MONITOR グループがなく、かつ
- *PSSR エラー処理サブルーチンをコーディングしていて、例外が
プログラム例外である場合、
あるいは、
- ファイルの INFSR エラー処理サブルーチンをコーディングしていて、例外が入出力例外である
場合、
このときは、その例外が処理され、エラー処理サブルーチンの最初の
ステートメントで制御が再開されます。
- エラー標識、'E'
拡張、またはエラー処理サブルーチンがコーディングされておらず、かつ例外を処理できる活動状態の
MONITOR グループがない場合は、RPG のデフォルトのエラー処理プログラムが呼び出されます。
- 例外が機能チェックでない 場合には、例外はパーコレートされ
ます。
- 例外が機能チェックである場合には、照会メッセージが
表示されます。 'G' または 'R' オプションを選択した場合には、機能チェックが処理され、プ
ロシージャーの適切な時点 ('G' の場合には *GETIN あるいは 'R' の場合には
例外を受け取った同じ演算仕様書) で制御が再開されます。 そうでない場合には、機能チェックが
パーコレートされ、プロシージャーが異常終了します。
RPG のデフォルト処理プログラムの詳細については、未処理例外を参照し
てください。
サブプロシージャー内の例外処理プログラム
サブプロシージャー内の例外処理プログラムはメイン・プロシージャーとは異
なり、次の方法があります。
- ユーザーは INFSR
サブルーチンのコーディングを行なえないため、ファイル・エラーの処理にはエラー標識、'E' 命令コード拡張、または
MONITOR グループを使わなければなりません。
- デフォルトの処理プログラムはありません。言い換えるとユーザーは、
照会メッセージを見ることはありません。
サブプロシージャー内の例外処理は、サブプロシージャー用に生成された RPG
サイクル・コードがないために、基本的にメイン・プロシージャーと異なっ
ています。結果として、サブプロシージャー用のデフォルトの例外処理プログラムがないので
、対応するメイン・プロシージャーのデフォルトの処理プログラムが呼び出された
場合には、サブプロシージャーの異常終了となります。 これは次のことを意味します。
- サブプロシージャー内の *PSSR サブルーチンの ENDSR 命令の演算項目 2
はブランクでなければなりません。 メイン・プロシージャー内のブランクの演算項目 2 は、
結果としてデフォルトの処理プログラムに制御が渡されることになります。
サブプロシージャーでは、ENDSR に達した場合には、サブプロシージャーが異
常終了し、サブプロシージャーの呼び出し元に RNX9001 が通知されます。
- *PSSR がなく、機能チェックが起こった場合には、プロシージャーが
呼び出しスタックから除去され、例外が呼び出し元にパーコレートされます。
- サブプロシージャー内のエラーについての照会メッセージは出されないの
で、一部の入出力エラーに使用可能な '再試行' 機能へはアクセスできません。
サブプロシージャー内でレコード・ロック・エラーが予想される場合には
エラー標識、または 'E' 拡張をコーディングして、状況がロックされているレコードに関連してい
るかどうかを検査する必要があります。
PSDS および INFDS がモジュールの有効範囲をもっていることに注意してくださ
い。 メイン・プロシージャーおよびサブプロシージャーともにこれらを
アクセスすることができます。
ヒント
*PSSR は、それがコーディングされているプロシージャーに対して
ローカルであるので、共通のエラー処理ルーチンとするためには、エラーを処理するための
プロシージャーをコーディングし、各ローカル *PSSR からそのプロシージャーを
呼び出すことができます。
OPM と ILE RPG 例外処理との違い
ほとんどの部分で OPM RPG と ILE RPG では、例外処理は同じように作動します。
重要な相違は処理不能例外の部分にあります。
OPM では、例外が起こり、RPG 特有の処理プログラムが活動状態でない場合には
、照会メッセージが出されます。 ILE では、これは、例外が機能チェックである場合にのみ起こります。 機能チェックでない場合には、例外はプロシージャーまたはプログラムの
呼び出し元に渡され、適格なより高位の呼び出しスタック項目が例外を処理できるよう
になります。 例えば、次の例を考えてください。
- PGM A が PGM B を呼び出し、次に PGM B が PGM C を呼び出します。
- PGM B では呼び出しに対するエラー標識がコーディングされています。
- PGM C にはエラー標識も *PSSR エラー処理サブルーチンもコーディングさ
れていません。
- PGM C が例外を受け取ります。
OPM では照会メッセージは PGM C に対して出されます。ILE では、例外は PGM C
によって処理されないため PGM B にパーコレートされます。PGM B のエラー標識はオンになって
PGM B がエラーを処理できるようになり、その過程で PGM C
が異常終了します。照会メッセージはありません。
PGM C に *PSSR エラー処理サブルーチンがコーディングされている場合には、
OPM でも ILE でも、例外は PGM C によって処理され、エラー処理サブルーチン
が実行されます。
注:
ILE RPG によって出される照会メッセージは OPM RPG と同様、'RPG'
ではなく 'RNQ' の接頭部で始まります。
特定のエラーの場合には一定の処理上の相違が存在します。 詳しくは
、付録A. OPM RPG/400 と AS/400 用 ILE RPG との動作上の相違点を参照してください。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.