exception - 为什么我捕获了异常却触发了运行时错误UNCAUGHT_EXCEPTION?

标签 exception abap

我希望下面的程序输出一条错误消息(通过WRITE),但实际上它在引发异常类型:

REPORT.
CLASS lcx_exception DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.
CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    METHODS main.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
  METHOD main.
    RAISE EXCEPTION TYPE lcx_exception.  "<===== HERE, run time error UNCAUGHT_EXCEPTION
  ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
  TRY.
    NEW lcl_app( )->main( ).
  CATCH lcx_exception INTO DATA(ex).
    WRITE: / 'Exception:', ex->get_text( ).
  ENDTRY.

最佳答案

解决方案是添加RAISING lcx_exception (最终可能会在此处列出更多异常类)到方法声明中,以便异常在发生时自动传播到调用过程(并希望被捕获):

REPORT.
CLASS lcx_exception DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.
CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    METHODS main RAISING lcx_exception. "<==================== HERE
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
  METHOD main.
    RAISE EXCEPTION TYPE lcx_exception.
  ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
  TRY.
    NEW lcl_app( )->main( ).
  CATCH lcx_exception INTO DATA(ex).
    WRITE: / 'Exception:', ex->get_text( ).
  ENDTRY.

请注意,您不能直接或间接列出从根类 CX_NO_CHECK 继承的异常类,因为这些异常是隐式传播的。只有直接或间接继承自 CX_STATIC_CHECKCX_DYNAMIC_CHECK 的异常类需要在 RAISING 之后指明才能传播。还可以指示这 2 个根类传播所有异常类。

关于exception - 为什么我捕获了异常却触发了运行时错误UNCAUGHT_EXCEPTION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65521573/

相关文章:

python - 尝试获取 HTTP 代码。有人可以在他们的 Python 解释器中为我尝试这段代码,看看为什么它不起作用吗?

php - 在 Cakephp 3 : not working 中捕获异常

abap - 计算ABAP中字符串的SHA2校验和

abap - 在 ABAP : TYPE or LIKE? 中应该使用哪个

abap - 如何使用 ABAP CDS 实现 NOT EXISTS?

abap - 三元运算符(替代方案)

Java:NoSuchElementException

python - 为什么这个 try/except/else 函数返回 None ?

java - junitparameter异常方法应该没有参数

dynamic - 在运行时从另一个程序读取非全局变量