在 Java 中,finally
关键字用于执行代码(与异常一起使用 - try..catch
语句),无论是否抛出异常( source )。
例如:
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!
此解决方案的优点是清除始终运行。它的缺点是需要一些代码重复,因为清理需要编写两次。如果将清理打包到一个方法中,那么它的代码重复量并不可怕。 :-/
最佳答案
ABAP 没有与 Java 完全相同的等价物 finally
堵塞。
有TRY
... CLEANUP
乍一看很相似的构造,但实际上工作方式却大不相同:
METHOD buggy_method.
TRY.
WRITE 'code before the error...'.
RAISE EXCEPTION TYPE cx_foo.
WRITE 'This line will not get executed.'.
CLEANUP.
WRITE 'Cleanup...'.
ENDTRY.
ENDMETHOD.
" ...on an outer scope...
TRY.
buggy_method( ).
CATCH cx_foo INTO DATA(lx_foo).
WRITE 'Caught the error!'.
ENDTRY.
输出:code before the error... Cleanup... Caught the error!
然而,清理块并不总是*被执行。它仅在出现异常时执行,该异常为 不是 由 CATCH
处理在同一 TRY
-堵塞。这个想法是将它用于清理,当异常由 TRY
处理时应该发生。 - 阻挡在外层。因此,无论您是否有错误,它对于您想要运行的代码都没有用。它仅对您要在 try 块无法自行处理的错误的情况下运行的代码有用。另一个功能涵盖了 Java 的一些用例
finally
块是resumable exceptions :" In the class definiton
METHODS buggy_method RAISING RESUMABLE(cx_foo).
" In the class implementation:
METHOD buggy_method.
WRITE 'code before the error...'.
RAISE RESUMABLE EXCEPTION TYPE cx_foo.
WRITE 'code after the error....'.
ENDMETHOD.
" Somewhere else:
TRY.
buggy_method( ).
CATCH BEFORE UNWIND cx_foo INTO DATA(lx_foo).
WRITE 'Caught the error!'.
RESUME.
ENDTRY.
输出:code before the error... Caught the error! code after the error....
RESUME
CATCH
末尾的关键字块导致执行在异常发生后立即继续 RAISE RESUMABLE
d.因此,当您想确保即使在发生错误的情况下也能执行方法的结尾时,这可能就是您正在寻找的语法。* 是的,我知道有一些奇特的边缘情况,其中 Java 中的 finally 块没有被执行。这些在这里无关紧要。
关于java - 在ABAP中,Java的finally关键字等价于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64918332/