未処理例外

未処理例外とは、最初に例外を受け取った呼び出しスタック項目に関連した例外 処理プログラムによって処理されなかった例外のことです。例外が未処理である時には、次のいずれかの処置が 取られます。

メッセージ・タイプが メイン・プロシージャーに関連した 機能チェック (CPF9999) である場合には、 RPG のデフォルトの処理プログラムは元の状態を説明する照会メッセージを出します。

他のタイプのメッセージの場合には、例外はプロシージャーの呼び出し元に対する呼び出しスタックにパーコレートされ ます。 そのプロシージャーは例外を提示され、それを処理できるようになります。 そのプロシージャーが例外を処理しない場合には、制御境界に達するまで、例 外が呼び出しスタックにパーコレートされ、制御境界に達すると、例外は 機能チェックに変換され、上記に説明したように例外処理がやり直されます。

未処理エスケープ・メッセージの例

次のシナリオで、エスケープ・メッセージが出され、それが起こったプロシージャーで処理できなかった時に 起こるイベントについて説明します。このシナリオでは次のことが想定されています。

  1. PGM1 と PGM2 という 2 つのプログラムがあり、これらは同じ活動化グル ープで実行されます。 それぞれには PRC1 と PRC2 という対応するプロシージャーが含まれています。
  2. PRC1 は PGM2 を動的に呼び出し、PRC2 が制御を受け取ります。
  3. PRC1 の CALL 命令コードには呼び出しに対するエラー標識があります。
  4. PRC2 には RPG 例外処理プログラムがコーディングされていません。 すなわち 、SUBST 命令に対するエラー標識がコーディングされておらず、また *PSSR エラー処理サブルーチンも ありません。
  5. PRC2 には演算項目 1 が負数である SUBST 命令があります。

PGM1 が PGM2 を呼び出す時に、SUBST 命令が試みられると、 例外メッセージ RNX0100 が生成されます。 図 129 は、このシナリオと発生する イベントを説明しています。

図 129. 処理不能エスケープ・メッセージのシナリオ

ここで次のことが起こります。

  1. PRC2 の SUBST 命令ではエラー標識も活動状態の MONITOR グループもなく、*PSSR エラー処理サブルーチンもコーディングされていないために、PRC2 はプログラム・エラーを処理することができず、エラーは処理不能となります。
  2. エラーは機能チェックでないので、PRC1 にパーコレートされます (呼び出し スタックを押し上げます)。
  3. PRC1 は同じ例外メッセージを受け取り (処理し)、CALL 命令のエラー標識 をオンに設定しますが、その影響で PRC2 が終了します。
  4. ここで処理は、PRC1 の CALL ステートメントの後のステートメントから続 行されます。

注:
説明した同じ例外処理イベントは、プロシージャー呼び出し (CALLB 命令) にも 適用します。

未処理機能チェックの例

次のシナリオでは、 メイン・プロシージャーで機能チェックが起こり、 処理されなかった時に起こるイベントについて説明します。 このシナリオでは次のことが想定されています。

  1. PGM1 と PGM2 という 2 つのプログラムがあり、それぞれ対応する PRC1 と PRC2 というプロシージャーを含んでいます。
  2. PRC1 は PGM2 を動的に呼び出し、PRC2 が制御を受け取ります。
  3. PRC1 の CALL 命令コードにはエラー標識がコーディングされていません。
  4. PRC2 には RPG 例外処理プログラムがコーディングされていません。 すなわち、エラー標識がコーディングされておらず、活動状態の MONITOR グループもなく、また *PSSR エラー処理サブルーチンもありません。
  5. PRC2 にはポインター・アドレス・エラーがあります。

PGM1 が PGM2 を呼び出すと、基底ポインターが null として定義されているので 、ポインター・エラーが起こります。 したがって、MCH1306 が生成されます。 PRC2 が制御境界を超えて 例外をパーコレートしようとすると、機能チェックが起こります。 図 130 は、このシナリオと発生するイベントを説明しています。

図 130. 処理不能の機能チェックのシナリオ

ここで次のことが起こります。

  1. PRC2 にはエラー処理プログラムがないので、PRC2 は機能チェックを処理することができず、例外は処理不能となります。
  2. 機能チェックであるために、元の状態を説明する照会メッセージが出され ます。
  3. 照会メッセージに対する応答によっては、PRC2 が終了し、例外が PRC1 に パーコレートされるか (応答が 'C' の場合)、あるいは処理が PRC2 で続行さ れることがあります (応答が 'G' の場合)。