Почему ошибка времени выполнения UNCAUGHT_EXCEPTION срабатывает, хотя я улавливаю исключение?

#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 корневых класса также могут быть указаны для распространения всех классов исключений.