1
我正在寫一個CL程序,它會遇到很多錯誤,因爲它會在像缺少對象(是的,這是故意的)等各種問題的環境中執行。我實際上不想監視這些可能的消息並繞過錯誤,而是重定向這些消息,以便它們可以使用程序消息並顯示給用戶。所以我想要的是程序執行後,程序會將所有錯誤信息顯示在屏幕的底部,而不是讓它們彈出並中斷執行。是否有可能這樣做?怎麼樣?如何捕獲AS400系統錯誤信息並將其用作CL中的我自己的程序信息?
我正在寫一個CL程序,它會遇到很多錯誤,因爲它會在像缺少對象(是的,這是故意的)等各種問題的環境中執行。我實際上不想監視這些可能的消息並繞過錯誤,而是重定向這些消息,以便它們可以使用程序消息並顯示給用戶。所以我想要的是程序執行後,程序會將所有錯誤信息顯示在屏幕的底部,而不是讓它們彈出並中斷執行。是否有可能這樣做?怎麼樣?如何捕獲AS400系統錯誤信息並將其用作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
編輯:添加子文件消息隊列來回答。
也許一個子文件消息隊列? 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
CLP:
DCLF FILE(BMENUFM)
...
CHGVAR &WPGMQ 'BMENU'
...
SNDF RCDFMT(BMENUC)
SNDRCVF RCDFMT(BMENUR)
這樣的程序本身不會完成它被設計爲,對不對?假設在ENDDO之後有第二個DLTF,這個語句不會被執行,是嗎? –
這是我目前如何做的一個例子。你不必精確地複製它 - 隨意從ERROR:處理到下一個子程序......在我的示例代碼中,我稱它爲PERCOLATE。查找[CALLSUBR](http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Frbam6%2Fcallsubrc.htm)它可以在V5R4上運行。 –
爲什麼在SNDPGMMSG後監視CPF0000和MCH0000?預計它會以某種方式失敗? –