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
:
:
