分类: 系统运维
2017-01-10 13:14:23
原文地址:ILE RPG 异常错误条件处理 作者:blogliou
我在2006年以前的博文中(http://blog.chinaunix.net/uid-583146-id-2090007.html) 提到了如何结合使用INFDS关键词定义的文件反馈信息结构和INFSR关键词定义的*PSSR意外错误控制程序.
在i5/OS 5.1版本之后, ILE RPG显然对如何进行错误处理进行了很多增强。有在操作符上使用E-extender, 以及使用%Error和%Status等BIFs, 以及使用monitor groups的。这些错误通常是在程序员知道在什么地方会发生错误的情况下而进行处理。本篇文章不讨论这些。
经常会有很多错误是出乎程序员预料的,程序员也无法预见什么时候什么地方发生错误,但是由希望RPG程序能够自动捕捉到异常错误,并转到错误处理例程进行处理或恢复,而不是程序在运行过程中因发生异常错误而终止运行。本文使用一个具体例子展示ILE RPG如何进行异常条件处理(Condition Handlers)。
异常条件处理关键是这几步:
0011.00 D CEEHDLR PR
0012.00 D pConHdlr * PROCPTR
0013.00 D CommArea * Const
0014.00 D
Feedback
12A OPTIONS(*OMIT)
0001.00 D pConHdlr S * PROCPTR
0002.00 D INZ(%paddr('CONDHDLR'))
0020.00 CEEHDLR(pConHdlr:%ADDR(Error):*OMIT);
以下是 用100除0来获得一个异常错误的RPG程序:
0001.00 D pConHdlr S * PROCPTR
0002.00 D INZ(%paddr('CONDHDLR'))
0003.00 D Error S 1N inz(*off)
0004.00 D Arr1 S 10A Dim(5)
0005.00 D Message S 40A INZ
0006.00
0007.00 D Hundred S 5 0 INZ(100)
0008.00 D Zero S 5 0 INZ(0)
0009.00 D Examp S 5 0 INZ
0010.00
0011.00 D CEEHDLR PR
0012.00 D pConHdlr * PROCPTR
0013.00 D CommArea * Const
0014.00 D Feedback 12A OPTIONS(*OMIT)
0015.00
0016.00 /Free
0017.00 Message = 'Starting CauseErr';
0018.00 Dsply Message '*REQUESTER';
0019.00
0020.00 CEEHDLR(pConHdlr:%ADDR(Error):*OMIT);
0021.00 Message = 'In CauseErr - causing Division error';
0022.00 Dsply Message '*REQUESTER';
0023.00
0024.00 Examp = %Div(Hundred:Zero);
0025.00 Message = 'Resume CauseErr';
0026.00 Dsply Message '*REQUESTER';
0027.00
0028.00 Exsr ErrHdl;
0029.00 *InLR = *On;
0030.00 Return;
0031.00
0032.00 BegSr ErrHdl;
0033.00 If Error;
0034.00 Message = 'In CauseErr Subr - Error detected';
0035.00 Dsply Message '*REQUESTER';
0036.00 Error = *Off;
0037.00 Endif;
0038.00 EndSr;
0039.00 /End-free
再写一个异常条件处理过程(Condition Handler),
0000.01 H NoMain
0001.00
0002.00 D CondHdlr PR
0003.00 D Parm1 12A
0004.00 D Parm2 *
0005.00 D Parm3 10I 0
0007.00
0008.00 PCondHdlr B Export
0008.01 D CondHdlr PI
0009.00 D InToken Like(CondToken)
0010.00 D pErrInfo *
0011.00 D Action 10I 0
0012.00
0013.00 DCondToken DS Based(IntokPoint)
0014.00 D CondSev 5I 0
0015.00 D CondMsgNo 2A
0016.00 D 1A
0017.00 D CondPrefix 3A
0018.00 D 4A
0018.01
0018.02 DError S 1N Inz
0018.03 DMessage S 40A INZ
0018.04 DResume S 10I 0 Inz(10)
0019.00
0020.00 /Free
0021.00 Message = 'Starting CondHdlr';
0022.00 Dsply Message '*REQUESTER';
0023.00 Error = *On;
0024.00 Action = Resume;
0025.00 Return;
0026.00 /End-free
0027.00
0028.00 P E
编译运行程序,输出结果,可以看到当RPG程序运行到100除0后,发生异常错误,程序自动捕捉到错误,并转到异常处理过程里,并恢复了程序继续执行:
DSPLY Starting CauseErr
DSPLY In CauseErr - causing Division error
DSPLY Starting CondHdlr
DSPLY Resume CauseErr