未処理例外
未処理例外とは、最初に例外を受け取った呼び出しスタック項目に関連した例外
処理プログラムによって処理されなかった例外のことです。例外が未処理である時には、次のいずれかの処置が
取られます。
メッセージ・タイプが
メイン・プロシージャーに関連した
機能チェック (CPF9999) である場合には、
RPG のデフォルトの処理プログラムは元の状態を説明する照会メッセージを出します。
- D (ダンプ) または C (取り消し) オプションを選択した場合には、最初に
例外を受け取ったプロシージャーが終了し、機能チェックが呼び出し元にパーコレート
されます。
- R (再試行) または G (入力取得) オプションを選択した場合には、機能
チェックが処理され、例外処理が終了し、プロシージャーが *GETIN (G を選択
した場合) あるいは例外が起こった入出力操作 (R を選択した場合) で処理を
再開します。 例えば、レコードのロックのために読み取りが正常に行われなかった場合に
は、読み取り操作が再試行されます。
他のタイプのメッセージの場合には、例外はプロシージャーの呼び出し元に対する呼び出しスタックにパーコレートされ
ます。 そのプロシージャーは例外を提示され、それを処理できるようになります。 そのプロシージャーが例外を処理しない場合には、制御境界に達するまで、例
外が呼び出しスタックにパーコレートされ、制御境界に達すると、例外は
機能チェックに変換され、上記に説明したように例外処理がやり直されます。
未処理エスケープ・メッセージの例
次のシナリオで、エスケープ・メッセージが出され、それが起こったプロシージャーで処理できなかった時に
起こるイベントについて説明します。このシナリオでは次のことが想定されています。
- PGM1 と PGM2 という 2 つのプログラムがあり、これらは同じ活動化グル
ープで実行されます。 それぞれには PRC1 と PRC2 という対応するプロシージャーが含まれています。
- PRC1 は PGM2 を動的に呼び出し、PRC2 が制御を受け取ります。
- PRC1 の CALL 命令コードには呼び出しに対するエラー標識があります。
- PRC2 には RPG 例外処理プログラムがコーディングされていません。 すなわち
、SUBST 命令に対するエラー標識がコーディングされておらず、また *PSSR エラー処理サブルーチンも
ありません。
- PRC2 には演算項目 1 が負数である SUBST 命令があります。
PGM1 が PGM2 を呼び出す時に、SUBST 命令が試みられると、
例外メッセージ RNX0100 が生成されます。 図 129 は、このシナリオと発生する
イベントを説明しています。
図 129. 処理不能エスケープ・メッセージのシナリオ
ここで次のことが起こります。
- PRC2 の SUBST 命令ではエラー標識も活動状態の MONITOR グループもなく、*PSSR
エラー処理サブルーチンもコーディングされていないために、PRC2
はプログラム・エラーを処理することができず、エラーは処理不能となります。
- エラーは機能チェックでないので、PRC1 にパーコレートされます (呼び出し
スタックを押し上げます)。
- PRC1 は同じ例外メッセージを受け取り (処理し)、CALL 命令のエラー標識
をオンに設定しますが、その影響で PRC2 が終了します。
- ここで処理は、PRC1 の CALL ステートメントの後のステートメントから続
行されます。
注:
説明した同じ例外処理イベントは、プロシージャー呼び出し (CALLB 命令) にも
適用します。
未処理機能チェックの例
次のシナリオでは、
メイン・プロシージャーで機能チェックが起こり、
処理されなかった時に起こるイベントについて説明します。 このシナリオでは次のことが想定されています。
- PGM1 と PGM2 という 2 つのプログラムがあり、それぞれ対応する PRC1
と PRC2 というプロシージャーを含んでいます。
- PRC1 は PGM2 を動的に呼び出し、PRC2 が制御を受け取ります。
- PRC1 の CALL 命令コードにはエラー標識がコーディングされていません。
- PRC2 には RPG 例外処理プログラムがコーディングされていません。
すなわち、エラー標識がコーディングされておらず、活動状態の MONITOR グループもなく、また *PSSR エラー処理サブルーチンもありません。
- PRC2 にはポインター・アドレス・エラーがあります。
PGM1 が PGM2 を呼び出すと、基底ポインターが null として定義されているので
、ポインター・エラーが起こります。 したがって、MCH1306 が生成されます。 PRC2 が制御境界を超えて
例外をパーコレートしようとすると、機能チェックが起こります。 図 130 は、このシナリオと発生するイベントを説明しています。
ここで次のことが起こります。
- PRC2 にはエラー処理プログラムがないので、PRC2
は機能チェックを処理することができず、例外は処理不能となります。
- 機能チェックであるために、元の状態を説明する照会メッセージが出され
ます。
- 照会メッセージに対する応答によっては、PRC2 が終了し、例外が PRC1 に
パーコレートされるか (応答が 'C' の場合)、あるいは処理が PRC2 で続行さ
れることがあります (応答が 'G' の場合)。
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.