CLP で発生するエラーの監視は専ら MONMSG によりモニターであるがここでは少し詳しい説明とともに
実践的な使用方法を紹介しよう。
【 CLP : TESTMON 】
---------------------------------------------------------------------------------- 0001.00 PGM PARM(&FILE &FILLIB) 0002.00 /*---------------------------------------------------------*/ 0003.00 /* TESTMON : MONMSG の使い方 */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0006.00 DCL VAR(&FILE) TYPE(*CHAR) LEN(10) 0007.00 DCL VAR(&FILLIB) TYPE(*CHAR) LEN(10) 0008.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0009.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0010.00 0011.00 RTVJOBA TYPE(&TYPE) 0012.00 CHKOBJ OBJ(&FILLIB/&FILE) OBJTYPE(*FILE) 0013.00 MONMSG MSGID(CPF9800) EXEC(GOTO CMDLBL(ERROR)) 0014.00 RETURN 0015.00 0016.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) 0017.00 SNDMSG: 0018.00 IF COND(&TYPE *EQ '0') THEN(DO) 0019.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP) 0020.00 ENDDO 0021.00 ELSE CMD(DO) 0022.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG) 0023.00 ENDDO 0024.00 ENDPGM ----------------------------------------------------------------------------------
【 解説 】
この CLP はファイル名: FILE とライブラリー名 : FILLIB という2つのパラメータを受け取って
ファイルが存在するかどうかを CHKOBJ コマンドによって検査している。最初に
0009.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
と行っているのは、この CLP のすべての演算中に障害が発生すれば ERROR というタグに
分岐するように指示している。
この記述によって予想できなかったエラー、例えばファイル名に「FILE%」 のように正しくない文字が
入ってするか、またはファイル名がブランクであったかのような場合である。
この記述がなければ予想外のエラーが発生したときはプログラムはエラー箇所で停止してしまう。
次に
0012.00 CHKOBJ OBJ(&FILLIB/&FILE) OBJTYPE(*FILE) 0013.00 MONMSG MSGID(CPF9800) EXEC(GOTO CMDLBL(ERROR))
であるがこれは先頭の MONMSG CPF0000 よりは優先して検査される。
CHKOBJ コマンドのガイドを見ればわかるが CHKOBJ コマンドのエラーは
CPF88C4 |
: | 新しいオブジェクトの値 &1 が 8桁を超えている |
CPF9801 |
: | ライブラリー &3 にオブジェクト &2 が見つからない |
CPF9802 |
: | &3 のオブジェクト &2 は認可されていない |
CPF9810 |
: | ライブラリー &1 が見つかりません |
CPF9815 |
: | ライブラリー &3 のファイル &2 のメンバー &5 が見つからない |
CPF9820 |
: | ライブラリー &1 の使用は認可されていない |
CPF9830 |
: | ライブラリー &1 を割り当てることができない |
CPF9899 |
: | コマンドの処理中にエラーが起こった |
のどれかのエラーを戻すはずである。
CPF88C4 を除けば他はすべて CPF98xx の形式であるので
MONMSG CPF9800
とは CPF98xx
形式のエラー・メッセージID をすべて
モニターするという意味である。
次にエラーが発生すると
0016.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)
によって最後のエラー・メッセージを受け取って変数 &MSG に取り込んでいる。
そして
0011.00 RTVJOBA TYPE(&TYPE)
によって取得した実行タイプ &TYPE には、これが対話式で実行された場合には &TYPE には 1 が入り、
バッチ・ジョブとして実行されていた場合には 0 が入るので、
0017.00 SNDMSG: 0018.00 IF COND(&TYPE *EQ '0') THEN(DO) 0019.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP) 0020.00 ENDDO 0021.00 ELSE CMD(DO) 0022.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG) 0023.00 ENDDO
によってバッチ・ジョブの場合はエラー・メッセージを操作員メッセージ( QSYSOPR ) に送信するようにしている。
この処理は面倒かも知れないがつねに対応を入れておくと、どのような環境で実行されたとしても確実に
メッセージを受け取ることができるので、つねに対応するように心がけて欲しい。