ABAP异常语句简析
文章目录
前言
提示:ABAP异常处理常见的是TRY CATCH组合,RETRY,CLEANUP,RESUME 虽然不常用,但是用来处理一些情况还是很好用的
一、语句介绍
1.RETRY
简单说RETRY必须在CATCH 语句下,捕捉到异常后,该语句将会重新执行TRY CATCH 中的TRY 块。
详情可以参考F1帮助
示例如下:
注:
- 如果没有在CATCH 块下做出处理使得TRY块不再继续抛出异常将会导致死循环。
- 在子例程中未处理的异常,抛到上一级将不会是原有异常,而是CX_SY_NO_HANDLE.
- 重新执行TRY块语句时,捕捉到的异常LR_ERROR 不会清空
- RETRY 会直接结束当前CATCH块(CATCH子句中RETRY后的语句不会执行)
2.RESUME
使用前提:
- 在CATCH子句中,需要CATCH 后跟BEFORE UNWIND
- 捕捉到的异常需要为可恢复的LR_ERROR-IS_RESUMABLE为ABAPTRUE
- 继承至CX_NO_CHECK的异常不可使用(系统内置异常)
和RETRY的区别是RESUME 会保留上下文,即使用RESUME后是从抛出异常的位置继续执行的,而不是重新执行TRY语句块,所以要配合BEFOR UNWIND 来使用
示例:
注意:
- 使用RESUME时必须加前置判断IS_RESUMABLE,否则RESUME语句本身会有异常
3.CATCH BEFORE UNWIND
此语句是用来在CATCH 子句执行时保留上下文
可以理解此时为执行CATCH 子句时,子例程中的局部变量及抛出异常的代码执行位置等会保留。
此处参考示例程序DEMO_CATCH_EXCEPTION
该示例程序也更好的解释了RESUME语句
注意:
- 如果CATCH 后跟BEFORE UNWIND, 则即使CLEARNUP语句在子例程中,实际执行时也会先执行上级程序中的CATCH子句。
4.CLEANUP
当TRY语句块中发生异常,在CATCH 语句中无捕获处理,向上递交给上层语句处理时,此时在被外层TRY CATCH 处理前,将会执行CLENUP 语句。
示例:
注意:
- CLEANUP由于是在递交给上层异常处理语句前执行的语句,所以必须完整执行,因此在CLEANUP下不能使用退出当前块的语句。比如SUBMIT等
总结
RETRY语句可以用来处理已经考虑到的异常,在异常发生后处理的一种途径
RESUME 对于我们来说可以在发生异常后,继续执行后续语句
CLEANUP 可以在当前层级把异常处理暂时拦截住,将数据处理后再进入外层数据,更灵活的处理异常结果