我正在编写一个 CL 程序,它将遇到很多错误,因为它将在存在各种问题(例如丢失对象)的环境中执行(是的,这是故意的)。我实际上不想监视这些可能的消息并绕过错误,而是想重定向这些消息,以便它们可以用作程序消息并显示给用户。所以我想要的是,程序执行后,程序将所有错误消息显示在屏幕底部,而不是让它们弹出并中断执行。可以这样做吗?怎么办?
最佳答案
这是我的标准 CL 错误处理流程。一般来说,我会使用 MONMSG 内联来处理我预计可能会出现的错误。一般来说,对于我预期的错误,我通常不会告诉最终用户。如果您需要这样做,请将 RCVMSG/SNDPGMMSG 对放入子例程中,并内联调用该子例程以将错误渗透给调用者。这个想法是接收诊断消息并将其重新发送给调用者,然后对异常消息执行相同的操作。
PGM
DCL &MSGID *CHAR 7
DCL &MSGDTA *CHAR 256
/* Trap all errors, and let the error routine handle */
MONMSG (CPF0000 MCH0000) EXEC(GOTO ERROR)
/* processing happens here */
/* if an unexpected error occurs, we drop to the error routine */
/* We expect this error, but tell the caller about it anyway */
dltf mylib/myfile
monmsg cpf2105 exec(do)
callsubr percolate
endoo
/* end of processing */
RETURN
/* This is the error handling routine. Basically it */
/* simply re-sends the messages back up to the */
/* caller, so it dies "gracefully" instead of */
/* giving a hard halt. */
/* Re-send diagnostic messages */
ERROR: RCVMSG MSGTYPE(*DIAG) MSGDTA(&MSGDTA) MSGID(&MSGID)
IF (&MSGID *EQ ' ') GOTO ERROR_ESC
SNDPGMMSG MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) +
MSGTYPE(*DIAG)
MONMSG (CPF0000 MCH0000)
GOTO ERROR
/* Re-send escape message and RETURN */
ERROR_ESC: RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID)
SNDPGMMSG MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) +
MSGTYPE(*ESCAPE)
MONMSG (CPF0000 MCH0000)
RETURN
ENDPGM
编辑:添加子文件消息队列来应答。
也许是一个子文件消息队列? 直接数据传输:
A R BMENUS SFL
A*
A TEXT('Message subfile')
A SFLMSGRCD(20)
A WMSGK SFLMSGKEY
A WPGMQ SFLPGMQ
A R BMENUC SFLCTL(BMENUS)
A*
A TEXT('Message subfile control recor-
A d')
A OVERLAY
A LOCK
A SFLDSP
A SFLINZ
A SFLSIZ(0006)
A SFLPAG(0003)
A WPGMQ SFLPGMQ
中电:
DCLF FILE(BMENUFM)
...
CHGVAR &WPGMQ 'BMENU'
...
SNDF RCDFMT(BMENUC)
SNDRCVF RCDFMT(BMENUR)
关于message - 如何捕获AS400系统错误消息并将其用作CL中我自己的程序消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12515154/