РАЗРАБОТКА ABAPP1L2

ABAP: исключения и контракт ошибок

Как class-based exceptions передают сбой через интерфейсы методов, где его обрабатывать и почему обработка не заменяет откат бизнес-операции.

Ревизия 1 Общие понятия Частичное покрытие Контекст: CTX-GENERAL документальная опора: недостаточно данных
Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.

Исключение в ABAP обозначает ситуацию, в которой обычное продолжение текущего пути выполнения не подходит. Для проектирования важны три вопроса: кто поднимает исключение, какие вызывающие методы обязаны его объявить или обработать и на каком уровне можно принять корректное решение.

Class-based exceptions#

Перехватываемое class-based exception представлено объектом класса исключения. Код поднимает его через RAISE EXCEPTION или THROW; обработчик задаётся блоком TRY ... CATCH ... ENDTRY. Если вызванный метод может передать исключение выше, его контракт должен это отражать через RAISING, либо вызывающий код должен обработать ситуацию.

Такой контракт помогает увидеть ошибки на границе вызова. Объявление RAISING не означает, что сбой уже обработан: оно лишь позволяет передать его следующему уровню. Если исключение не обработано, оно может завершить программу с runtime error. Поэтому обработчик размещают там, где доступны данные для осмысленного решения: преобразовать ошибку в понятный результат, добавить контекст или остановить операцию с диагностикой.

Выбор класса и уровня#

Иерархия класса влияет на требования к интерфейсам и распространению. В классическом ABAP и разных моделях разработки встречаются CX_STATIC_CHECK, CX_DYNAMIC_CHECK и CX_NO_CHECK; конкретные обязанности вызывающего кода сверяйте для целевого выпуска и языкового режима. Не выбирайте базовый класс только ради удаления строки RAISING: решение влияет на то, какие вызовы статически показывают возможный отказ.

Группируйте классы по восстанавливаемым причинам, а не по месту, где их случайно заметили. Например, неверные входные данные и временная недоступность внешней зависимости требуют разных действий. Не перехватывайте общий суперкласс, чтобы без разбора продолжать обработку: это способно превратить частичную операцию в неполный или неверный финансовый результат.

Классические исключения и миграция#

В документации SAP non-class-based exceptions описаны как предшествующая модель; для новой разработки их не следует проектировать как основной контракт. В старом коде можно встретить EXCEPTIONS, RAISE и проверку sy-subrc. При миграции нужно сохранить соответствие старых кодов ошибок и нового смысла исключений, включая поведение вызывающих систем и RFC-границ. Механическая замена sy-subrc на общий CATCH не доказывает эквивалентность.

Финансовый пример и границы#

Если расчёт сверки отклоняет дубликат ключа или разные валюты, это должно быть явным результатом контракта: специальное исключение, типизированный список ошибок или другой заранее определённый ответ. Не подменяйте ошибку нулевой суммой и не продолжайте агрегирование по оставшимся строкам без правила, утверждённого предметной моделью.

Обработка исключения сама по себе не откатывает финансовую операцию. Она не определяет границы LUW, блокировки, уже выполненные записи, внешние вызовы или компенсирующие действия. Эти эффекты проектируются и проверяются отдельно. Синтетический пример Python из соседней лаборатории не проверяет ABAP-исключения и не доказывает поведение SAP.

Ссылки ведут на документацию разных поколений ABAP и инструментов разработки. Перед применением проверьте документацию и ограничения целевой версии. Здесь нет результата синтаксической проверки, ABAP Unit или выполнения в SAP runtime.

Связанные материалы#

Источники и документация

  1. SAP ABAP Keyword Documentation: Exception Handling ↗
  2. SAP ABAP Keyword Documentation: Non-Class-Based Exceptions ↗
  3. SAP ABAP Development Tools: Exception Handling ↗

Источники нужны для самостоятельной проверки. Примеры и интерпретации на сайте могут быть учебными упрощениями.