免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: adam_0_0_0
打印 上一主题 下一主题

monmsg捕获异常的疑问,在线等 [复制链接]

论坛徽章:
0
11 [报告]
发表于 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号。

论坛徽章:
0
12 [报告]
发表于 2009-12-14 10:28 |只看该作者
原帖由 passthru 于 2009-12-14 09:56 发表

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



謝謝你的回答,我現在就是不想讓系統自動彈出錯誤信息,應當怎么做?

论坛徽章:
0
13 [报告]
发表于 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

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

你自己先把你的问题搞清楚先 逻辑混乱

论坛徽章:
0
14 [报告]
发表于 2009-12-16 09:15 |只看该作者
很多人语文都不行,英文更不行,不会把问题讲清楚。
不过我觉得13楼讲的大部分对,也有不太对的地方:

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

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

AS/400 MONMSG的作用就是当出现某个MSG那样的错误后,不要让操作系统以默认的方式弹出出错信息,而是交由你的程序来处理,例如你可以在屏幕上显示出错记录数,就好象杀毒软件那样边查边显示发现100个病毒、发现101个病毒、......

论坛徽章:
0
15 [报告]
发表于 2009-12-16 09:29 |只看该作者
在RPG程序中,遇到重复键值的情况,可能会有几种处理方式:
1、根本不管,由操作系统拦截,显示出错信息
2、自己在程序中检测出错,用指示器或者 IF        %ERROR (RPGLE)判断,然后处理(写LOG,或者显示出错信息,继续下一条记录处理或者程序终止等等)
3、预先扫描是否存在与将要写进去的记录键值相同的记录,如果存在,根本就不WRITE或UPDATE,然后进行相关的处理
我自己一般用方法2或3

论坛徽章:
0
16 [报告]
发表于 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 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2009-12-16 10:25 |只看该作者
楼主的意思就是我上贴的意思,只是楼主表达不清楚。呵呵

论坛徽章:
0
18 [报告]
发表于 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 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2009-12-16 22:46 |只看该作者
可从系统角度去处理:
1.CHGJOBD JOBD(QGPL/QDFTJOBD) INQMSGRPY(*SYSRPYL)
2.ADDRPYLE加入自动系统回复的MSGID和默认回复即可。

论坛徽章:
0
20 [报告]
发表于 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP