我正在编写一个 CL 程序,该程序会遇到很多错误,因为它将在存在各种问题的环境中执行,例如丢失对象(是的,这是故意的)。实际上,我不想监视这些可能的消息并绕过错误,而是希望重定向这些消息,以便它们可以用于程序消息并显示给用户。所以我想要的是在程序执行后,程序将所有错误消息显示在屏幕底部,而不是让它们弹出并中断执行。有可能这样做吗?如何?
问问题
11841 次
1 回答
4
这是我的标准 CL 错误处理过程。一般来说,我会使用 MONMSG inline 来处理我预计可能会出现的错误。通常,对于我预期的错误,我通常不会告诉最终用户它们。如果您需要这样做,请将 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
编辑:添加子文件消息队列来回答。
也许是子文件消息队列?DDS:
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)
于 2012-09-20T15:21:49.373 回答