Что умеет Try Catch в ABAP?
У данной конструкции открываются дополнительные возможности, если добавить такие операторы, как CLEANUP, RESUME, RETRY и BEFORE UNWIND. Обсудим для чего они нужны и как с ними работать.
CLEANUP
Блок CLEANUP будет использоваться для удаления ссылок перед завершением вызова метода. Всякий раз, когда возникает исключение, система прекращает обработку с этого момента и переходит к соответствующему блоку TRY. Из-за такого поведения объект будет находиться в промежуточном состоянии. Блок CLEANUP предоставляет нам возможность восстановить состояние объекта перед выходом из текущего блока обработки.
В этом примере у нас есть «внешний» блок TRY..ENDTRY в методе method1. У нас есть «внутренний» блок TRY..ENDTRY в методе method2, который запускается из внешнего блока. Поскольку мы делим на 0, оператор деления вызовет исключение типа CX_SY_ZERODIVIDE. Поскольку мы перехватываем все исключения, используя CATCH CX_ROOT во внешнем блоке TRY, система выполнит логику блока CLEANUP во внутреннем блоке TRY.
Замените этот CX_ROOT на CX_SY_BUFFER_OVERFLOW, который не является частью иерархии CX_SY_ZERODIVIDE, поэтому CLEANUP не будет выполнена, и это приведет к дампу во время выполнения.
RESUME
С RESUME вы выходите из блока CATCH и возобновляете обработку после инструкции, вызвавшей исключение. Пример ниже отлично демонстрирует возможности RESUME.
Благодаря RESUME в методе получения зарплаты, когда зарплата не была найдена, в таком случае нам надо сообщить об ошибке и добавить запись. Если убрать RESUME то после вызова исключения, запись в таблицу добавленна не будет.
Не обращайте внимание на BEFORE UNWIND, о нём мы поговорим чуть позже.
RETRY
С RETRY вы выходите из блока CATCH и прыгаете обратно в блок TRY структура управления для того, чтобы повторить полный блок TRY. Конечно, вы должны позаботиться о том, чтобы исключение не повторялось снова и снова, иначе вы попадете в бесконечный цикл.
BEFORE UNWIND
Если указано дополнение BEFORE UNWIND, контекст, в котором исключение был вызван, включая все вызванные процедуры и их локальные данные, удаляется только после выхода из CATCH блок. Если добавление не указано, контекст удаляется до выполнения CATCH блока.
- Если дополнение BEFORE UNWIND указано, оператор RESUME может быть использован в CATCH блоке для обработки возобновляемого исключения, чтобы возобновить обработку после инструкции, которая вызвала исключение. Это единственный случай, когда контекст исключения не удаляется при выходе из CATCH блока.
- Возобновляемые исключения также могут обрабатываться CATCH блоками без добавления BEFORE UNWIND. В этом случае контекст исключения удаляется перед процессом обработки, и оператор RESUME не может быть указан.
- Любые CLEANUP блоки всегда выполняется непосредственно перед удалением их контекста. Если BEFORE UNWIND используется, то после обработки исключений и во всех остальных случаях до обработки исключений.
- Использование дополнения BEFORE UNWIND для CATCH требуется только тогда, когда заявление RESUME используется. Однако это в принципе разрешено во время обработки исключений, если контекст исключения должен быть оценен перед любыми действиями по очистке в CLEANUP блоки. Это имеет смысл, например, при обработке узких мест в ресурсах, если высвобождение ресурсов в CLEANUP блоке изменили бы контекст и, таким образом, произвели бы вычисление, свободные ресурсы в обработчике исключений бессмысленны.