前回の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ライブラリーにファイルを書き込む前に、もし存在していたら削除せよ!などというケースでよく利用しています。