Учитывая классическое исключение ABAP, подобное следующему:
MESSAGE ID 'XYZ' TYPE 'E' NUMBER 123 RAISING exception_name
Как мне перехватить это исключение в вызывающем коде?
Я пробовал try
/catch
, CASE sy-subrc
и CATCH SYSTEM-EXCEPTIONS
(это уже даже не компилируется, поскольку устарело), но ни один из них не работает. Программа сразу же завершает работу и отображает сообщение об ошибке в левом нижнем углу SAPGUI.
Допустим, в функции 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.
Решение указано в документации 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
.
Готово + ссылки на документацию ABAP для всех тем, посвященных исключениям, не связанным с классами.
Нужен пример!