2

我正在编写一个 CL 程序,该程序会遇到很多错误,因为它将在存在各种问题的环境中执行,例如丢失对象(是的,这是故意的)。实际上,我不想监视这些可能的消息并绕过错误,而是希望重定向这些消息,以便它们可以用于程序消息并显示给用户。所以我想要的是在程序执行后,程序将所有错误消息显示在屏幕底部,而不是让它们弹出并中断执行。有可能这样做吗?如何?

4

1 回答 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 回答