finally
用于执行代码(与异常-try..catch
语句一起使用),无论是否抛出异常都会执行(来源)。例如:
try {
// this code might throw an exception
riskyCall();
// this code will only run if no exception was thrown above
mainProgram();
}
finally {
// this code will always run
cleanUp();
}
ABAP是否有相应功能?如果没有,有什么惯用的方法实现相同的功能呢?
我知道ABAP有一个CLEANUP关键字,但似乎只会在抛出异常时执行。
我尝试过以下代码,可能是一种可行的解决方案。不幸的是,我无法想到任何不需要复制代码的解决方案。
METHOD risky_method.
TRY.
WRITE 'code before...'.
IF lv_error_condition = abap_true.
RAISE EXCEPTION TYPE cx_foo.
ENDIF.
WRITE 'Main program...'.
WRITE 'Cleanup...'.
CLEANUP.
WRITE 'Cleanup...'.
ENDTRY.
ENDMETHOD.
METHOD outer_scope.
TRY.
risky_method( ).
CATCH cx_foo INTO DATA(lx_foo).
WRITE 'Caught the error!'.
ENDTRY.
ENDMETHOD.
当
lv_error_condition
等于abap_false
时,执行outer_scope
方法的输出为:code before... Main program... Cleanup...
如果
lv_error_condition
等于abap_true
,输出结果为:code before... Cleanup... Caught the error!
该解决方案的优点是清理总是运行。它的缺点是需要一些代码重复,因为清理需要写两次。如果将清理打包到一个方法中,那么代码重复就不是非常糟糕了。 :-/
finally
的一个重要注意点是:它只有在代码仍在运行时才会触发。如果try
块中的代码导致虚拟机崩溃,你的finally
就永远不会生效。最著名的故事是一家银行在面试申请者时,“finally 可能无法生效”,银行坚称它一定会生效,然后申请者问道,“好的,如果我绊倒电源线会发生什么?” 银行沉默了一会儿,然后匆忙召集了它的工程团队。 - Mike 'Pomax' Kamermans