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 }