【问题标题】:How to capture AS400 system error message and use it as my own program message in CL?如何在 CL 中捕获 AS400 系统错误消息并将其用作我自己的程序消息?
【发布时间】:2012-09-20 14:45:31
【问题描述】:

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

【问题讨论】:

    标签: message ibm-midrange


    【解决方案1】:

    这是我的标准 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)
    

    【讨论】:

    • 这样,程序本身不会完成它的设计目标,对吧?假设 ENDDO 之后还有第二个 DLTF,这条语句不会被执行,是吗?
    • 这是我目前如何做的一个例子。您不必完全复制它 - 随意将处理从 ERROR: 向下转换为子例程...在我的示例代码中,我将其称为 PERCOLATE。查找CALLSUBR它在V5R4上工作。
    • 为什么要在 SNDPMMSG 之后监控 CPF0000 和 MCH0000?预计它会以某种方式失败?
    • 如果出现问题并且在错误处理程序中失败,全局 MONMSG 会将代码循环回标准错误处理程序。哪个会失败并循环等。
    • 是否可以以某种方式重定向消息队列设置,以便该程序中的所有错误消息都会自动转到程序消息队列?
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多