C/400

23. エラー処理応用 C/400 での MONMSG

C/400でのエラー監視(モニター・メッセージ) の方法について紹介する。
CLP では MONMSG でエラーを監視できるしRPGでも *INFSR によってモニター・メッセージ
することができる。
C/400 でも予測できなかったさまざまなエラーに予め対処しておくことができる。
C/400ではシグナル・ハンドラーという手法で

#pragma exception_handler(MONMSG, ca, 0, _C2_MH_ESCAPE, \
                                 _CTLA_HANDLE)

が CLP での MONMSG の役割を果たす。

#pragma disable_handler

までのあいだでエラーが発生すればMONMSG というタグに制御が移動する。

次のサンプルは CLP での

CHKOBJ     OBJ(QGPL/MYFILE) OBJTYPE(*FILE)
MONMSG     MSGID(CPF9800) EXEC(GOTO CMDLBL(MONMSG))

と同じ処理をC/400で表している。

0001.00 #include <stdio.h>
0002.00 #include <stdlib.h>
0003.00 #include <string.h>
0004.00 #include <QCMDEXC.h>
0005.00 #include <signal.h>
0006.00
0007.00 #define TRUE         0
0008.00 #define FALSE       -1
0009.00
0010.00 void main(void){
0011.00    char Cmd[512];
0012.00    int  CmdLen;
0013.00    char FILE[] = {"MYFILE"};
0014.00    char TOLIB[] = {"QGPL"};
0015.00   volatile _INTRPT_Hndlr_Parms_T ca;
0016.00 #define  CHKOBJ   "CHKOBJ  OBJ(%s/%s) OBJTYPE(*FILE)   "
0017.00
0018.00     #pragma exception_handler(MONMSG, ca, 0, _C2_MH_ESCAPE, \
0019.00                                        _CTLA_HANDLE)
0020.00    CmdLen = sprintf(Cmd, CHKOBJ, TOLIB, FILE);
0021.00    QCMDEXC(Cmd, CmdLen);/* CHKOBJ MYLIB/MYFILE *FILE */
0022.00     printf("fuond file = %s/%s\n", TOLIB, FILE);
0023.00     getchar();
0024.00 MONMSG:
0025.00     #pragma disable_handler
0026.00     printf("not found %s/%s\n", TOLIB, FILE);
0027.00     getchar();
0028.00 }