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

AS400, Java, JavaEE, JSF等の開発、習慣など。日々の気づきをまとめたブログ(備忘録)

【AS400】CLでの例外処理

前回のRPG例外処理に続き、今度はCLでの例外処理です。

方法は、MONMSG命令により実行プログラムが例外扱いと判定するので、その際に吐き出されるメッセージIDをキャッチし、その例外処理を実装する、そんな感じでしょうか。

実際に、サンプルを見ます。
下記のソースは、パラメータで指定したOUTQが存在するかをチェックするもので、存在する場合は、OUTPUTパラメータで'1'を返し、存在しない場合には'0'を返すメソッドになります。

サンプルCL「OUTQの存在チェック」
PGM000: PGM   PARM(&P@OUTQ  &P@EXIST)                                   
        DCL  VAR(&P@OUTQ)  TYPE(*CHAR)  LEN(10) /* OUTQ      */
        DCL  VAR(&P@EXIST) TYPE(*CHAR)  LEN(02) /* EXIST-FLG */
        CHGVAR  VAR(&P@EXIST)  VALUE('1') 

        CHKOBJ  OBJ(&P@OUTQ)  OBJTYPE(*OUTQ) 
          /* オブジェクトが見つからない等の例外処理 */ 
            MONMSG     MSGID(CPF9800) EXEC(DO) 
                CHGVAR  VAR(&P@EXIST)  VALUE('0')  
            ENDDO
          /* その他の例外処理 */
            MONMSG  MSGID(CPF9999)  EXEC(DO) 
                CHGVAR  VAR(&P@EXIST)  VALUE('0')  
            ENDDO
PGM999: ENDPGM  

「MONMSG CPF9800」は、 CPF98と前方一致のエラー・メッセージIDすべてをモニターを指示します。CPF98関連のメッセージは、下記の通りです。

主なメッセージ
MSGID エラー内容
CPF9801 ライブラリーにオブジェクトが見つからない
CPF9802 オブジェクトは認可されていない
CPF9803 オブジェクトを割り振ることができません
CPF9804 オブジェクトが損傷している
CPF9805 オブジェクトが壊れている
CPF9810 ライブラリーが見つかりません
CPF9820 ライブラリーの使用は認可されていない
CPF9821 プログラムの使用は認可されていない
CPF9822 ファイルの使用は認可されていない
CPF9830 ライブラリーを割り当てることはできない
CPF9899 コマンドの処理中にエラーが起こった
CPF9999 モニターされないその他すべて例外(機能チェック。監視されていません)


メッセージの詳細は、下記のコマンドで確認可能です(メッセージIDを指定します)。

DSPMSGD RANGE(CPF9810 *ONLY)  
                         表示するメッセージ明細の選択
                               
 メッセージ ID  . . . . . . . :   CPF9810
 メッセージ・ファイル . . . . :   QCPFMSG 
   ライブラリー . . . . . . . :     QSYS
 メッセージ・テキスト . . . . :    ライブラリー &1 が見つかりません。
                                  
                                       
 次の中から1つを選んでください。 
                                 
      1. メッセージ・テキストの表示
      2. フィールド・データの表示 
                             
      5. メッセージ属性の表示 
                                
     30. 上記オプションのすべて       
                                      
                                      
                                      
 選択項目                            
                                    
                                     
 F3= 終了   F12= 取消し        

例外を無視するCPF0000

例外が発生しても、発生したエラーを無視する場合には、メッセージID「CPF0000」を使用します。

下記の例では、ファイル削除を実行していますが、
もし、ターゲットのファイルが存在しなくても、エラーを無視し、処理を続行してくれます。

DLTF     FILE(QTEMP/WSAMPLE01)     
  MONMSG     MSGID(CPF0000)  

この処理は、TEMPライブラリーにファイルを書き込む前に、もし存在していたら削除せよ!などというケースでよく利用しています。