ABAP异常语句简析

文章目录


前言

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

一、语句介绍

1.RETRY

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

       详情可以参考F1帮助

示例如下:

ABAP异常语句简析

注:

  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 来使用

示例:

ABAP异常语句简析

注意:

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

3.CATCH BEFORE UNWIND

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

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

此处参考示例程序DEMO_CATCH_EXCEPTION

ABAP异常语句简析

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

注意:

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

4.CLEANUP

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

示例:

ABAP异常语句简析

注意:

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

总结

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

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

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