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 }