尽管我捕获了异常,但为什么会触发运行时错误 UNCAUGHT_EXCEPTION?

问题描述

我希望以下程序输出错误消息(通过 WRITE),但实际上它在 UNCAUGHT_EXCEPTION 时触发了运行时错误 RAISE EXCEPTION TYPE(短转储):

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 个根类传播所有异常类。