ABAP异常处理语句简析

文章目录


前言

在开发过程中程序一旦dump 就会导致很多问题,尤其是供外部调用的借口。正确的处理异常,防止dump造成的流程数据不完整,日志记录不全等就显得尤为重要了。

ABAP异常处理常见的是TRY CATCH组合,RETRY,CLEANUP,RESUME 虽然不常用,但是用来处理一些情况还是很好用的

一、语句介绍

1.RETRY

       简单说RETRY必须在CATCH 语句下,捕捉到异常后,该语句将会重新执行TRY CATCH 中的TRY 块。

       详情可以参考F1帮助

示例如下:

注:

  1. 如果没有在CATCH 块下做出处理使得TRY块不再继续抛出异常将会导致死循环
  2. 在子例程中未处理的异常,抛到上一级将不会是原有异常,而是CX_SY_NO_HANDLE.
  3. 重新执行TRY块语句时,捕捉到的异常LR_ERROR 不会清空
  4. RETRY 会直接结束当前CATCH块(CATCH子句中RETRY后的语句不会执行)

2.RESUME

使用前提:

  1. 在CATCH子句中,需要CATCH 后跟BEFORE UNWIND
  2. 捕捉到的异常需要为可恢复的LR_ERROR-IS_RESUMABLE为ABAPTRUE
  3. 继承至CX_NO_CHECK的异常不可使用(系统内置异常)

和RETRY的区别是RESUME 会保留上下文,即使用RESUME后是从抛出异常的位置继续执行的,而不是重新执行TRY语句块,所以要配合BEFOR UNWIND 来使用

示例:

注意:

  1. 使用RESUME时必须加前置判断IS_RESUMABLE,否则RESUME语句本身会有异常

3.CATCH BEFORE UNWIND

此语句是用来在CATCH 子句执行时保留上下文

可以理解此时为执行CATCH 子句时,子例程中的局部变量及抛出异常的代码执行位置等会保留。

此处参考示例程序DEMO_CATCH_EXCEPTION

该示例程序也更好的解释了RESUME语句

注意:

  1. 如果CATCH 后跟BEFORE UNWIND, 则即使CLEARNUP语句在子例程中,实际执行时也会先执行上级程序中的CATCH子句。

4.CLEANUP

当TRY语句块中发生异常,在CATCH 语句中无捕获处理,向上递交给上层语句处理时,此时在被外层TRY CATCH 处理前,将会执行CLENUP 语句。

示例:

注意:

  1. CLEANUP由于是在递交给上层异常处理语句前执行的语句,所以必须完整执行,因此在CLEANUP下不能使用退出当前块的语句。比如SUBMIT等

总结

RETRY语句可以用来处理已经考虑到的异常,在异常发生后处理的一种途径

RESUME 对于我们来说可以在发生异常后,继续执行后续语句

CLEANUP 可以在当前层级把异常处理暂时拦截住,将数据处理后再进入外层数据,更灵活的处理异常结果

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值