下面的代码序列重复了引发和处理基于类的异常的众所周知的原则:
类cx\u demo定义继承自cx\u static\u check.
ENDCLASS.
类cls定义.
PUBLIC SECTION.
类方法meth引发cx\u demo.
ENDCLASS.
类cls实现.
METHODmeth.
…
RAISE EXCEPTION TYPE cx\u demo.
…
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
TRY.
cls=>meth().
CATCH cx\u demo INTO DATA(exc.
cl\u demo\u output=>display(`Handling`&
cl\u abap\u classdescr=>get\u class\u name(p\u object=exc)).
ENDTRY.
要完成,还应显示清除的含义:
class cx\u demo 0定义继承自cx\u静态\u检查。
ENDCLASS.
CLASS cx\u demo1定义继承自cx\u静态\u检查。
ENDCLASS.
START-OF-SELECTION.
DATA(exception)=`cx\u demo1`.
cl\u demou input=>request(CHANGING field=exception.
DATA exc TYPE REF TO cx\u static \u check.
exc=COND#(exception=`cx\u demo0`时,则为NEW cx\u demo0()
ELSE NEW cx\u demo1())。
TRY.
TRY.
RAISE EXCEPTION exc.
CATCH cx\u demo0.
cl\u demo\u output=>write('Catching cx\u demo0')。
CLEANUP.
cl\u demo\u output=>write('CLEANUP')。
ENDTRY.
CATCH cx\u demo1.
cl\u demo\u output=>write('Catching cx\u demo1')。
ENDTRY.
cl\u demo\u output=>display()。
在本例中,您可以决定是否引发类cx\u demo0或cx\u demo1的异常。cx\u demo0在内部处理,cx\u demo1在外部TRY块中处理。在后一种情况下,在离开内部TRY块之前,执行CLEANUP块,从而提供清理内部TRY块的机会。这里没有显示的是额外的,淘客模板,也可以用来清理。
众所周知的事实,因为6.10版(哈欠)。7.02版引入的RETRY和RESUME可能不太为人所知。
使用RETRY,您将退出CATCH块并跳回当前TRY控制结构的TRY语句,以便重试整个TRY块。当然你要小心,这个异常不会一次又一次的重复出现,否则你会陷入一个无休止的循环中。
类cx\u demo定义继承自cx\u static\u check。
ENDCLASS。
类cls定义。
PUBLIC SECTION。
类数据标志类型abap\u bool。
类方法meth提升cx\u demo。
ENDCLASS。
类cls实现。
方法方法
…
如果flag=abap\u false。
cl\u demo\u输出=>写入(`Raising`.)。
RAISE异常类型cx\u demo。
ENDIF。
…
ENDMETHOD。
ENDCLASS。
开始选择。
TRY。
cls=>方法()。
捕获cx\u demo。
cl\u demo\u输出=>写入(`Handling`.)。
cls=>flag=abap\u true。
重试。
ENDTRY。
cl\u demo\u输出=>显示().
如果缺少某个先决条件(这里是一个标志),则会引发异常。在处理过程中,先决条件被完全填充,TRY块的保护区被重复执行,
使用RESUME退出CATCH块,在引发异常的语句之后继续处理。前提条件是:
类cx\u demo定义继承自cx\u static\u check.
ENDCLASS.
类cls定义.
PUBLIC SECTION.
类METHODS meth rising RESUMABLE(cx\u demo).
ENDCLASS.
类cls实现.
方法meth.
…
cl\u demo\u output=>write(`rising`.).
rise RESUMABLE EXCEPTION TYPEcx\u demo.
clu demo\u output=>write('Resuming…')。
…
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
TRY.
cls=>meth()。
CATCH-BEFORE-diswind cx\u demo.
clu demo\u output=>write(`Handling`.)。
RESUME.
ENDTRY.
clu demo\u output=>display()。
这里提供的信息可能对您有用。
有关更多信息,好评返现,请参阅基于类的异常。
我已经使用可恢复的异常很长时间了,我发现它们非常有用。
演示程序demo\u CATCH\u EXCEPTION真的帮助我理解了释放前的行为,淘大客,RESUME et al.
PS-我还没有看到任何标准SAP类使用可恢复异常,尽管
DEMO\u CATCH\u EXCEPTION
我调用了一个RESTful Web服务,有时如果服务器进入睡眠状态,第一次尝试连接就会失败(第一次尝试会唤醒它,所以第二次尝试就可以了)。重试在这些情况下是很好的-确保我只重试一次,但是
你能分享一个可恢复的用例吗?
我在这里讨论过:我在哪里使用可恢复异常?
是的,如前所述,云产品,出现可恢复异常的原因是为了让调用程序控制错误是否致命。
我在较低级别方法中对表进行循环时使用可恢复,例如需要过帐的文档表。如果一个文档有错误,我会提出一个异常并在上层方法中捕获它,云服务器怎么样,但仍然希望继续处理其他文档。
顺便说一下,我希望在较低版本中看到7.50中新的T100消息处理。有没有可能?