CL

60. CLP でのエラー・モニター (1)

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 ) に送信するようにしている。
この処理は面倒かも知れないがつねに対応を入れておくと、どのような環境で実行されたとしても確実に
メッセージを受け取ることができるので、つねに対応するように心がけて欲しい。