message - 如何捕获AS400系统错误消息并将其用作CL中我自己的程序消息?

标签 message ibm-midrange

我正在编写一个 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/

相关文章:

Delphi:JEDI 桌面警报的替代方案(气球)

Java Socket 不向客户端和服务器发送消息

java - 来自数据库的消息包 Spring MVC 3

sql - 插入带有字母字符串和压缩小数的混合 db2 字段

ibm-midrange - 如何处理 RPGLE 中的错误?

PHP 到 AS400 连接通过来自浏览器的 ODBC/PDO 错误

php - 如何用 PHP 抓取 AS400?

javascript - jQuery 队列消息

r - 加载包时禁用消息

java - 从JAVA调用AS400 RPG程序