先に紹介したRPGでの例外処理にて、個別に例外処理を組み込むことが可能になりますが、例外が発生した場合、モニタリングし、例外をキャッチした場合、共通処理として何らかの処理を実行させる方法が一般的かと思います。
例外発生後の共通処理としては、
- QSYSOPRへのメッセージ送信
- 管理者へのメール送信
- テーブルへの書き込み
などがあるかと思います。
まずは、モニタ方法として、サンプルRPGを作ってみました。
(※共通処理ではなく、あくまでも確認のため、例外発生結果をDSPLYしています)
サンプル(SAMPLE26)
D************************************************************************** D* PROGRAM STATUS DATA STRUCTURE DEFINITION D************************************************************************** D I@SDSD SDS D I@PGID 1 10 // MAIN PROC名 D I@STAT 11 15 // プログラム状況CD D I@LINE 21 28 // STATEMENT 番号 D I@ERID 40 46 // 例外ID D I@MGID 40 42 // 例外タイプ D I@MGNO 43 46 // 例外番号 D I@EDTA 91 170 // 例外データ D I@JBNM 244 253 // ジョブ名 D I@URID 254 263 // ユーザー名 D I@JBNO 264 0269 0 // ジョブ番号 D* D************************************************************************** D* VARIABLE DEFINITION D************************************************************************** D W@VAL1 S 5S 0 INZ(100) // VALUE 1 D W@VAL2 S 5S 0 INZ(0) // VALUE 2 D W@VAL3 S 5S 0 // RESULT D* C************************************************************************** C* MAIN C************************************************************************** /FREE W@VAL3 = W@VAL1 / W@VAL2; DSPLY W@VAL3; *INLR = *ON; RETURN; //*********************************************************************** //* EXCEPTION/ERROR ROUTINE //*********************************************************************** BEGSR *PSSR; DSPLY I@ERID; // 例外ID DSPLY I@LINE; // STATEMENT番号 DSPLY %SUBST(I@EDTA:1:52); // 例外データ(DSPLYの出力文字サイズは52文字) ENDSR '*CANCL'; /END-FREE
- サンプルでは、ゼロ除算が必ず発生します。ゼロ除算をキャッチすると、処理はただちにサブルーチン「*PSSR」へ遷移します。
- プラログム状況データ構造(SDS)に例外情報がセットされるので、その値をDSPLYしています。
- 例外処理の共通化は、*PSSRサブルーチンを/COPYで外部記述すると良いかと思われます。
実行結果
> CALL SAMPLE26 固定小数点演算でゼロによる除算を実行しようとした。 DSPLY MCH1211 DSPLY 00000027 DSPLY 固定小数点演算でゼロによる除算を実行しようとした。 RPG 状況 00102 によって,プログラム TIGEROBJ/SAMPLE26 のプロシージャー SAMPLE26 が停止した。 アプリケーション・エラー。 RNX9001 は, SAMPLE26 によってステートメント *N 命令 X'0000' で監視されていません。