タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【AS400】RPGでのエラーモニター処理

先に紹介した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' で監視されていません。