问题描述
我希望以下程序输出错误消息(通过 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_CHECK
和 CX_DYNAMIC_CHECK
的异常类需要在 RAISING
后指明才能传播。也可以指示这 2 个根类传播所有异常类。