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

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

Исключения позволяют передавать управление от одной части программы к другой. Обработка исключений 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- Программа перехватывает исключение с помощью обработчика исключений в том месте программы, где вы хотите обработать проблему. Ключевое слово CATCH указывает на перехват исключения.

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

Вызов исключений

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

  • Исключения, вызванные системой времени выполнения 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 = exref→GET_TEXT( ). 

CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. 
msgtxt = exref→GET_TEXT( ).

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

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

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

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

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

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

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

Textid

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

2

Previous

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

3

get_text

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

4

get_longtext

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

5

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_1→GET_TEXT( ). 
CLEANUP. 
CLEAR res_1. 
ENDTRY. 

CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ).

CATCH CX_ROOT INTO orf_1. 
txt_1 = orf_1→GET_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.

Square Root and Division with: 160 
The absolute value of number is too high 
Final Result is:  0.00