java - 在ABAP中,Java的finally关键字等价于什么?

标签 java exception abap

在 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/

相关文章:

java - 按下按钮时启动无限循环线程,再次按下按钮时停止

grouping - LOOP AT... GROUP BY 使用动态组键

c# - RFC_READ_TABLE 查询大量列后抛出 Rfcabapexception

exception - 可恢复异常 : any real-life scenario?

java - sqlite 插入重复条目

java - 如何在编辑文本字段上设置单词java(android)

用于日期和军事时间的 Java 正则表达式失败

Java 未处理异常消失

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

winforms - 由于Microsoft.ReportingServices.Rendering.RichText.CachedFont GetFont,ReportViewer崩溃