Chinaunix

标题: monmsg捕获异常的疑问,在线等 [打印本页]

作者: adam_0_0_0    时间: 2009-12-11 11:33
标题: monmsg捕获异常的疑问,在线等
我有一个rpg文件,在执行时,如果有异常,不错处理的情况下应当是系统自动弹出系统messag,显示出异常,并且程序终端。
我想做到的效果是如果出现异常,忽略掉,继续执行程序。
看到一些资料说在cl中加monmsg就可以,所以我写了一个简单的cl
PGM                                   
MONMSG MSGID(CPF0000) exec(goto aa)
CALL PGM(SLTST/CUSPOPR)         
aa;call pgm(sltst/othersys)      
ENDPGM   

可是现在的效果是
程序执行-》发现异常-》系统自动弹出异常消息-》跳到aa中执行新程序

我想要的效果是
程序执行-》发现异常-》跳到aa中执行新程序
就是不要系统弹出异常消息。   应当怎么做?
作者: adam_0_0_0    时间: 2009-12-11 14:18
自己頂一下吧,想知道出現異常時錯誤顯示是否可以隱藏
作者: wyd1003    时间: 2009-12-11 14:23
我也想知道解决方法,期望高手解答!!!!!
作者: wyd1003    时间: 2009-12-11 14:25
high hand(guru) 在哪里???
赶快出来解答
作者: adam_0_0_0    时间: 2009-12-11 14:27
咕嚕 周五都休息
作者: adam_0_0_0    时间: 2009-12-11 17:25
要下班了,还是没有答案呀
作者: huangxkst    时间: 2009-12-11 21:38
原帖由 adam_0_0_0 于 2009-12-11 11:33 发表
我有一个rpg文件,在执行时,如果有异常,不错处理的情况下应当是系统自动弹出系统messag,显示出异常,并且程序终端。
我想做到的效果是如果出现异常,忽略掉,继续执行程序。
看到一些资料说在cl中加monmsg ...


程序执行-》发现异常-》跳到aa中执行新程序

基本思路:

             PGM                                 

             MONMSG     MSGID(CPF0000) EXEC(DO)  
        /*发现异常 : 执行你想执行的程序然后执行下面的命令退出程序*/
            goto   pgmend   
          enddo

       /*没有发现异常 执行程序*/
      
pgmend:                                          
            
             ENDPGM

[ 本帖最后由 huangxkst 于 2009-12-11 21:42 编辑 ]
作者: janggs    时间: 2009-12-12 00:15
标题: 回复 #1 adam_0_0_0 的帖子
I am confused with your question:
The message that system return you should turn down your job, how can you still proceed your aa logical?
So please clarify your message first.

For CMD MONMSG:

Action A
MONMSG(CPF0000) EXEC(GO TO aa)
MONMSG(CPF0001)
CALL PGM(C1)

aa:  CALL PGM(C2)

------------------------
if CPF0000 catched, then go to logical aa to CALL PGM(C2)
if CPF0001 catched, then do nothing to perform CALL PGM(C1) according to program original sequence
if CPF0003 catched, and this exception msg you not defined before to catch, then system break down.
so in order to avoid system break down, you can define exception msg like
MONMSG(CPF0000 XXX0000) sorry that I forget the exact msg name, which means catch all exception msg,
then write a simple logical to feed back the error, such as 'unexpected error occur'
作者: adam_0_0_0    时间: 2009-12-14 08:54
原帖由 huangxkst 于 2009-12-11 21:38 发表


程序执行-》发现异常-》跳到aa中执行新程序

基本思路:

             PGM                                 

             MONMSG     MSGID(CPF0000) EXEC(DO)  
        /*发现异常 : 执行你想执 ...


感谢你的回复。不过还是没有解决弹出错误消息的问题。 我在rpg中有意制造了一个往pf文件插数据时,出现重复数据的情况,根据你的这个思路,当出现重复插入主键相同数据的时候,会弹出“(C G S D F) CUSPOPR 908 CPRRSPF が重複レコードを書き出そうとした ”错误,我不想要这种错误提示。
作者: adam_0_0_0    时间: 2009-12-14 08:55
原帖由 janggs 于 2009-12-12 00:15 发表
I am confused with your question:
The message that system return you should turn down your job, how can you still proceed your aa logical?
So please clarify your message first.

For CMD MONMS ...


感谢你的回复,发生错误时,不一定都要关闭程序吧。我可以在发生异常的时候,做其他的处理。
作者: passthru    时间: 2009-12-14 09:56
原帖由 adam_0_0_0 于 2009-12-11 11:33 发表
我有一个rpg文件,在执行时,如果有异常,不错处理的情况下应当是系统自动弹出系统messag,显示出异常,并且程序终端。
我想做到的效果是如果出现异常,忽略掉,继续执行程序。
看到一些资料说在cl中加monmsg ...

楼主有三个概念错误:
1)进入CL PGM后就立即MONMSG,一定是MSGID为CPF0000,而不能进行条件判断。所以,肯定是goto aa执行条件程序。
2)楼主的意思,在rpg出错后rpg不进行*pssr处理而直接把*pssr进行处理过程返回到cl进行处理,这里从rpg程序返回到cl的应该是出错的msgid号,cl根据msgid号再进行条件判断处理。处理逻辑应该是这样的:
   pgm
         call rpg程序(xxx)parm(&参数1 &参数2...)       //假设&参数2为返回的msgid号
              if cond(&参数2 *eq ‘CPF0001’) than(goto aa)
             .....

aa    .....
3)monmsg一般用于上一条cl程序行中cl命令执行情况的系统返回的msgid,所以,monmsg一般跟在这样的cl行之后,而不能monmsg另外一个rpg的出错信息。monmsg CL命令,msgid都会在Redbook或400联机help中有详细说明,都会列写出所有可能发生的错误msgid号。
作者: adam_0_0_0    时间: 2009-12-14 10:28
原帖由 passthru 于 2009-12-14 09:56 发表

楼主有三个概念错误:
1)进入CL PGM后就立即MONMSG,一定是MSGID为CPF0000,而不能进行条件判断。所以,肯定是goto aa执行条件程序。
2)楼主的意思,在rpg出错后rpg不进行*pssr处理而直接把*pssr进行处理 ...



謝謝你的回答,我現在就是不想讓系統自動彈出錯誤信息,應當怎么做?
作者: janggs    时间: 2009-12-15 22:10
标题: 回复 #10 adam_0_0_0 的帖子
是不是你英文很烂啊 不懂我在说什么?
你首先说明白你的MSG是什么MSG?
是   “(C G S D F) CUSPOPR 908 CPRRSPF が重複レコードを書き出そうとした ” 这样的??
这样MSG是系统崩溃的意思 是BUG懂不?  不能把这样的产品交给客户的
当这样的情况出现的时候ADMINISTRATOR会电话给firefighter 问怎么处理的
所以你要MONMSG 做相应的处理
你MON到了 当然可以做你的处理
如果你MON到了 不处理  OK 继续跑下面的代码 不会弹出你的那种MSG的
但是你不MON 那么遇到这个错误 系统就会崩溃  然后给你弹出上面的MSG

所以我问你  你怎么可能出了上面的消息  还要进一步处理?? 都崩溃了 还处理啥? 也就是根本不可以让他崩溃
出了严重的错误 当然要让程序死掉 避免写入非法数据 就是这个逻辑

你自己先把你的问题搞清楚先 逻辑混乱
作者: ux400    时间: 2009-12-16 09:15
很多人语文都不行,英文更不行,不会把问题讲清楚。
不过我觉得13楼讲的大部分对,也有不太对的地方:

“所以我问你  你怎么可能出了上面的消息  还要进一步处理?? 都崩溃了 还处理啥? 也就是根本不可以让他崩溃
出了严重的错误 当然要让程序死掉 避免写入非法数据 就是这个逻辑”

出现重复键值算不算严重的错误?我觉得算。
但是举一个例子,我的旧系统数据可能有垃圾,有重复键值,现在我要移植到新系统,假如有上百万条记录,我希望遇到重复键值程序不要死掉,而是在屏幕上按我规定的方式显示出遇到了某种错误,或者将错误信息写进LOG文件,然后移植下一条记录,等上百万条记录全部处理完,再人工检查处理错误的记录,看需不需要移植,是否需要修改某些字段后再移植这些原先有错误的记录,在大部分情况下,有问题的记录毕竟是少数,如果程序每次出错就退出,这个移植工作的效率是否太低了?

AS/400 MONMSG的作用就是当出现某个MSG那样的错误后,不要让操作系统以默认的方式弹出出错信息,而是交由你的程序来处理,例如你可以在屏幕上显示出错记录数,就好象杀毒软件那样边查边显示发现100个病毒、发现101个病毒、......
作者: ux400    时间: 2009-12-16 09:29
在RPG程序中,遇到重复键值的情况,可能会有几种处理方式:
1、根本不管,由操作系统拦截,显示出错信息
2、自己在程序中检测出错,用指示器或者 IF        %ERROR (RPGLE)判断,然后处理(写LOG,或者显示出错信息,继续下一条记录处理或者程序终止等等)
3、预先扫描是否存在与将要写进去的记录键值相同的记录,如果存在,根本就不WRITE或UPDATE,然后进行相关的处理
我自己一般用方法2或3
作者: passthru    时间: 2009-12-16 10:19
对一些已经知道结果的MSG可以在CL中进行如下处理。如这个CL程序有一句把参数传入的LIB加入库列表语句。第二次调研这个CL程序,系统就会报CPF2103信息。如果我们不想按照系统提供的中断选择g命令继续执行程序,只要这样做

  .......
   ADDLIBLE   LIB(&LIB3)   
   MONMSG     MSGID(CPF2103)
   ......
   这样CL程序就可以继续执行,而屏幕上就不会再出现系统MSG。

[ 本帖最后由 passthru 于 2009-12-16 10:22 编辑 ]
作者: passthru    时间: 2009-12-16 10:25
楼主的意思就是我上贴的意思,只是楼主表达不清楚。呵呵
作者: coolk    时间: 2009-12-16 21:37
原帖由 adam_0_0_0 于 2009-12-14 08:54 发表


感谢你的回复。不过还是没有解决弹出错误消息的问题。 我在rpg中有意制造了一个往pf文件插数据时,出现重复数据的情况,根据你的这个思路,当出现重复插入主键相同数据的时候,会弹出“(C G S D F) CUSPOPR ...



因为在RPG程序中插入数据到PF文件出现重复键值,所产生的MSG 不是CPFXXXX的,所以你进行MONMSG CPF0000当然是不成功的!

[ 本帖最后由 coolk 于 2009-12-16 21:39 编辑 ]
作者: qingzhou    时间: 2009-12-16 22:46
可从系统角度去处理:
1.CHGJOBD JOBD(QGPL/QDFTJOBD) INQMSGRPY(*SYSRPYL)
2.ADDRPYLE加入自动系统回复的MSGID和默认回复即可。
作者: goodhorce    时间: 2012-10-30 09:59
MONMSG CPF0000 只是在发现Escape 消息后不中断Job
要删除消息:
         QSYS/MONMSG MSGID(CPF2105) EXEC(QSYS/DO)   
            QSYS/RCVMSG PGMQ(*SAME *) MSGTYPE(*LAST) RMV(*YES)
         QSYS/ENDDO
作者: qiao_zq    时间: 2012-11-02 14:34
一个简单的异常处理问题,会有这样的结果!                               
楼主可能已经不来这里了,为了保证程序的健壮性,程序中经常要有异常处理代码,楼主的想法没有问题。
但是错误的原因在于应该在抛出异常的位置捕获异常进行处理,也就是在程序CUSPOPR中。
程序CUSPOPR有异常被抛出,但是没有捕获,就是问题的原因。
通过系统的自动应答列表也可以解决问题。
作者: goodhorce    时间: 2012-11-11 15:07
http://68boke.com/?p=25




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2