Как перехватить исключение типа MESSAGE RAISING?

Учитывая классическое исключение ABAP, подобное следующему:

MESSAGE ID 'XYZ' TYPE 'E' NUMBER 123 RAISING exception_name

Как мне перехватить это исключение в вызывающем коде?

Я пробовал try/catch, CASE sy-subrc и CATCH SYSTEM-EXCEPTIONS (это уже даже не компилируется, поскольку устарело), ​​но ни один из них не работает. Программа сразу же завершает работу и отображает сообщение об ошибке в левом нижнем углу SAPGUI.

Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
646
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Допустим, в функции cl_foo=>bar возникает классическое исключение. Вы перехватываете исключение, указывая параметры при вызове функции с помощью ключевого слова EXCEPTIONS. После этого позвоните CASE sy-subrc.

Например:

cl_foo=>bar( EXCEPTIONS foo1   = 1
                        foo2   = 2
                        foo3   = 3
                        OTHERS = 4 ).
CASE sy-subrc.
  WHEN 0.
      WRITE: / |Success|.
  WHEN OTHERS.
      WRITE: / |Error|.
ENDCASE.
  1. Классические исключения объявляются на вкладке ИСКЛЮЧЕНИЯ.
  2. Добавьте FM через Pattern->CALL FUNCTION, чтобы были добавлены все типы параметров: ИМПОРТ, ЭКСПОРТ... и ИСКЛЮЧЕНИЯ.
  3. Исключения перечисляются путем присвоения последовательного номера (который можно изменить). Это число возвращается в переменной SY-SUBRC, если оно встречается.
  4. Проверьте SY-SUBRC, если значение не равно 0, произошло исключение (эквивалент возвращаемого числа).

Нужен пример!

Jonathan Benn 05.04.2024 14:57
Ответ принят как подходящий

Решение указано в документации ABAP MESSAGE, RAISING:

Если оператор MESSAGE выполняется с добавлением RAISING во время обработки метода или функционального модуля, вызывающая сторона которого присваивает возвращаемое значение исключению с использованием дополнения EXCEPTIONS оператора CALL, этот оператор имеет тот же эффект, что и оператор ПОДНИМАТЬ.

По ссылке исключение вы можете увидеть главу об обращении:

Обработка исключений, не связанных с классами, становится возможной благодаря добавлению EXCEPTIONS в вызовы методов и функциональных модулей путем присвоения исключениям числовых значений, которые используются для заполнения системного поля sy-subrc при возникновении исключения. Фактическая обработка ошибок происходит после вызова, когда оценивается sy-subrc.

Если исключение возникает внутри функционального модуля (или подпрограммы внутри этого функционального модуля), вы должны обработать его следующим образом:

CALL FUNCTION '...'
  EXCEPTIONS
    exception_name = 1.
IF sy-subrc = 1.
  " handling of exception_name
ENDIF.

Если исключение возникает внутри метода, вы можете обработать его следующим образом:

cl_foo=>bar( EXCEPTIONS exception_name = 1 ).
IF sy-subrc = 1.
  " handling of exception_name
ENDIF.

Специальное имя исключения OTHERS можно использовать, чтобы не упоминать все имена исключений.

Обратите внимание, что эти «исключения, не основанные на классах», устарели, их «больше не следует определять в новых разработках ». Вместо этого вам следует использовать исключения на основе классов (которые работают по-другому).

Ссылки на документацию ABAP для всех тем, посвященных исключениям, не связанным с классами:

Спасибо за хорошее объяснение со ссылками на документацию и примерами. Примеры можно улучшить, включив ключевое слово OTHERS.

Jonathan Benn 05.04.2024 15:01

Готово + ссылки на документацию ABAP для всех тем, посвященных исключениям, не связанным с классами.

Sandra Rossi 06.04.2024 09:23

Другие вопросы по теме