CL

124. デバッグするにはMONMSGははずして

CLPでは想定外のエラーを監視するために MONMSG CPF0000
記述することは一般的に行われている。
例えば

CLPテンプレート:

ソースはこちらから

0001.00              PGM                                                        
0002.00 /*-------------------------------------------------------------------*/ 
0003.00 /*   AA1_SAMPLE :  テンプレート・サンプル CLP                        */ 
0004.00 /*                                                                   */ 
0005.00 /*   2018/02/01  作成                                                */ 
0006.00 /*-------------------------------------------------------------------*/ 
0007.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                  
0008.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                  
0009.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                  
0010.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)               
0011.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)               
0012.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                   
0013.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                
0014.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +             
0015.00                           VALUE('*ESCAPE   ')                           
0016.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +             
0017.00                           VALUE(X'000074') /* 2 進数  */                
0018.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                    
0019.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                
0020.00                           VALUE(X'00000000')                            
0021.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         
0022.00                                                                         
  :
    :
0046.00                                                                        
0047.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +            
0048.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +  
0049.00                           MSGFLIB(&MSGFLIB)                            
0050.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                  
0051.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +    
0052.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)            
0053.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                    
0054.00              ENDDO                                                     
0055.00              ELSE       CMD(DO)                                        
0056.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +           
0057.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +            
0058.00                           MSGTYPE(&MSGTYPE)                            
0059.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                    
0060.00              ENDDO                                                     
0061.00              ENDPGM   


                                                    

[解説]

この例では

0021.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 

としてCPF0000を監視しているので本文中で想定外のCPFエラーが起こったときは
制御は ERRORタグに移動してそこで発生したエラーを表示する。

MONMSG が無ければ「ステートメント XXXX で CPFxxxxのエラーを受取った」と
メッセージされるのでエンド・ユーザーに不安を与えてしまう。
これがソフトウェア製品であればエラーが想定されていないとして
ユーザーに不信感を与えてしまう。
ソフトウェア製品である以上不用意にアベンドするようなことがあってはいけない。

しかし開発中にMONMSGの記述があるとアベンドは避けられるのだが
どこでエラーが発生したのかが不明となりエラーの解析に手間取ってしまう。
またエンド・ユーザーにリリースしていない開発中のときは
むしろ MONMSG はないほうがよい。
MONMSGがなければ「ステートメント XXXX で CPFxxxxのエラーを受取った」と
メッセージが報告されるので直ちにエラーの場所を知ることができる。

開発中のときはむしろMONMSGはコメント化しておくほうがよい。

   :                           
0021.00            /*MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) */        
0022.00                                                                         
  :
    :