Учебники

SAP ABAP — обработка исключений

Исключением является проблема, возникающая при выполнении программы. Когда возникает исключение, нормальный поток программы прерывается, и приложение программы ненормально завершается, что не рекомендуется, поэтому эти исключения должны быть обработаны.

Исключения предоставляют способ передачи управления из одной части программы в другую. Обработка исключений ABAP построена на трех ключевых словах — RAISE, TRY, CATCH и CLEANUP. Предполагая, что блок вызовет исключение, метод перехватывает исключение, используя комбинацию ключевых слов TRY и CATCH. Вокруг кода помещается блок TRY — CATCH, который может генерировать исключение. Ниже приведен синтаксис использования TRY — CATCH —

TRY.      
Try Block <Code that raises an exception> 
  
CATCH  
Catch Block <exception handler M>  
. . . 
. . . 
. . . 
CATCH  
Catch Block <exception handler R>
   
CLEANUP. 
   Cleanup block <to restore consistent state>
 
ENDTRY.

RAISE — Исключения поднимаются, чтобы показать, что произошла какая-то исключительная ситуация. Обычно обработчик исключений пытается исправить ошибку или найти альтернативное решение.

TRY — блок TRY содержит код приложения, исключения которого должны обрабатываться. Этот блок операторов обрабатывается последовательно. Он может содержать дополнительные управляющие структуры и вызовы процедур или других программ ABAP. За ним следует один или несколько блоков улова.

CATCH — программа ловит исключение с помощью обработчика исключений в том месте программы, где вы хотите решить проблему. Ключевое слово CATCH указывает на перехват исключения.

CLEANUP — операторы блока CLEANUP выполняются всякий раз, когда возникает исключение в блоке TRY, который не перехватывается обработчиком той же конструкции TRY — ENDTRY. В предложении CLEANUP система может восстановить объект в согласованное состояние или освободить внешние ресурсы. То есть работа по очистке может быть выполнена для контекста блока TRY.

Возбуждение исключений

Исключения могут возникать в любой точке метода, функционального модуля, подпрограммы и т. Д. Есть два способа исключения:

  • Исключения, поднятые системой времени выполнения ABAP.

    Например, Y = 1 / 0. Это приведет к ошибке времени выполнения типа CX_SY_ZERODIVIDE.

  • Исключения подняты программистом.

    Поднимите и создайте объект исключения одновременно. Создайте исключение с объектом исключения, который уже существует в первом сценарии. Синтаксис: RAISE EXCEPTION exep.

Исключения, поднятые системой времени выполнения ABAP.

Например, Y = 1 / 0. Это приведет к ошибке времени выполнения типа CX_SY_ZERODIVIDE.

Исключения подняты программистом.

Поднимите и создайте объект исключения одновременно. Создайте исключение с объектом исключения, который уже существует в первом сценарии. Синтаксис: RAISE EXCEPTION exep.

Ловить исключения

Обработчики используются для отлова исключений.

Давайте посмотрим на фрагмент кода —

DATA: result TYPE P LENGTH 8 DECIMALS 2, 
exref TYPE REF TO CX_ROOT, 
msgtxt TYPE STRING. 
PARAMETERS: Num1 TYPE I, Num2 TYPE I. 
TRY. 
result = Num1 / Num2. 
CATCH CX_SY_ZERODIVIDE INTO exref. 
msgtxt = exrefGET_TEXT( ). 

CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. 
msgtxt = exrefGET_TEXT( ).

В приведенном выше фрагменте кода мы пытаемся разделить Num1 на Num2, чтобы получить результат в переменной типа float.

Могут быть сгенерированы два типа исключений.

  • Ошибка преобразования числа.

  • Разделите на ноль исключений. Обработчики ловят исключение CX_SY_CONVERSION_NO_NUMBER, а также исключение CX_SY_ZERODIVIDE. Здесь метод GET_TEXT () класса исключения используется для получения описания исключения.

Ошибка преобразования числа.

Разделите на ноль исключений. Обработчики ловят исключение CX_SY_CONVERSION_NO_NUMBER, а также исключение CX_SY_ZERODIVIDE. Здесь метод GET_TEXT () класса исключения используется для получения описания исключения.

Атрибуты исключений

Вот пять атрибутов и методов исключений —

S.No. Атрибут и описание
1

Textid

Используется для определения различных текстов для исключений, а также влияет на результат метода get_text.

2

предыдущий

Этот атрибут может хранить исходное исключение, которое позволяет вам создавать цепочку исключений.

3

get_text

Это возвращает текстовое представление в виде строки в соответствии с системным языком исключения.

4

get_longtext

Это возвращает длинный вариант текстового представления исключения в виде строки.

5

get_source_position

Дает имя программы и номер строки, достигнутой там, где возникло исключение.

Textid

Используется для определения различных текстов для исключений, а также влияет на результат метода get_text.

предыдущий

Этот атрибут может хранить исходное исключение, которое позволяет вам создавать цепочку исключений.

get_text

Это возвращает текстовое представление в виде строки в соответствии с системным языком исключения.

get_longtext

Это возвращает длинный вариант текстового представления исключения в виде строки.

get_source_position

Дает имя программы и номер строки, достигнутой там, где возникло исключение.

пример

REPORT ZExceptionsDemo. 
PARAMETERS Num_1 TYPE I. 

DATA res_1 TYPE P DECIMALS 2. 
DATA orf_1 TYPE REF TO CX_ROOT. 
DATA txt_1 TYPE STRING. 

start-of-selection. 
Write: / 'Square Root and Division with:', Num_1. 
write: /. 

TRY. 
IF ABS( Num_1 ) > 150. 
RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE. 
ENDIF.
  
TRY. 
res_1 = SQRT( Num_1 ). 
Write: / 'Result of square root:', res_1. 
res_1 = 1 / Num_1. 

Write: / 'Result of division:', res_1. 
CATCH CX_SY_ZERODIVIDE INTO orf_1. 
txt_1 = orf_1GET_TEXT( ). 
CLEANUP. 
CLEAR res_1. 
ENDTRY. 

CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. 
txt_1 = orf_1GET_TEXT( ).

CATCH CX_ROOT INTO orf_1. 
txt_1 = orf_1GET_TEXT( ). 
ENDTRY. 
IF NOT txt_1 IS INITIAL. 
Write / txt_1. 
ENDIF. 
Write: / 'Final Result is:', res_1.

В этом примере, если число больше 150, возникает исключение CX_DEMO_ABS_TOO_LARGE. Приведенный выше код производит следующий вывод для числа 160.