#exception #abap
#исключение #abap
Вопрос:
Я ожидаю, что следующая программа выведет сообщение об ошибке (via 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.
Комментарии:
1. Хороший вопрос, основанный на моем комментарии к другому! 😉
Ответ №1:
Решение состоит в том, чтобы добавить 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 корневых класса также могут быть указаны для распространения всех классов исключений.