SAP ABAP - Tratamento de exceções

A exceptioné um problema que surge durante a execução de um programa. Quando ocorre uma exceção, o fluxo normal do programa é interrompido e o aplicativo do programa é encerrado de forma anormal, o que não é recomendado; portanto, essas exceções devem ser tratadas.

As exceções fornecem uma maneira de transferir o controle de uma parte de um programa para outra. O tratamento de exceções ABAP é baseado em três palavras-chave - RAISE, TRY, CATCH e CLEANUP. Assumindo que um bloco gerará uma exceção, um método captura uma exceção usando uma combinação das palavras-chave TRY e CATCH. Um bloco TRY-CATCH é colocado ao redor do código que pode gerar uma exceção. A seguir está a sintaxe para usar 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- Exceções são levantadas para indicar que alguma situação excepcional ocorreu. Normalmente, um tratador de exceção tenta reparar o erro ou encontrar uma solução alternativa.

TRY- O bloco TRY contém a codificação do aplicativo cujas exceções devem ser tratadas. Este bloco de instruções é processado sequencialmente. Ele pode conter outras estruturas de controle e chamadas de procedimentos ou outros programas ABAP. Ele é seguido por um ou mais blocos catch.

CATCH- Um programa captura uma exceção com um tratador de exceção no local de um programa onde você deseja tratar o problema. A palavra-chave CATCH indica a captura de uma exceção.

CLEANUP- As instruções do bloco CLEANUP são executadas sempre que ocorre uma exceção em um bloco TRY que não é capturada pelo manipulador da mesma construção TRY - ENDTRY. Dentro da cláusula CLEANUP, o sistema pode restaurar um objeto a um estado consistente ou liberar recursos externos. Ou seja, o trabalho de limpeza pode ser executado para o contexto do bloco TRY.

Levantando exceções

As exceções podem ser levantadas em qualquer ponto de um método, um módulo de função, uma sub-rotina e assim por diante. Existem duas maneiras de gerar uma exceção -

  • Exceções levantadas pelo sistema de tempo de execução ABAP.

    Por exemplo, Y = 1 / 0. Isso resultará em um erro de tempo de execução do tipo CX_SY_ZERODIVIDE.

  • Exceções levantadas pelo programador.

    Aumente e crie um objeto de exceção simultaneamente. Gerar uma exceção com um objeto de exceção que já existe no primeiro cenário. A sintaxe é: RAISE EXCEPTION exep.

Captura de exceções

Os manipuladores são usados ​​para capturar exceções.

Vamos dar uma olhada em um snippet de código -

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( ).

No trecho de código acima, estamos tentando dividir Num1 por Num2 para obter o resultado em uma variável do tipo float.

Dois tipos de exceções podem ser gerados.

  • Erro de conversão de número.

  • Divida por exceção zero. Os manipuladores capturam a exceção CX_SY_CONVERSION_NO_NUMBER e também a exceção CX_SY_ZERODIVIDE. Aqui, o método GET_TEXT () da classe de exceção é usado para obter a descrição da exceção.

Atributos de exceções

Aqui estão os cinco atributos e métodos de exceções -

S.No. Atributo e descrição
1

Textid

Usado para definir textos diferentes para exceções e também afeta o resultado do método get_text.

2

Previous

Este atributo pode armazenar a exceção original que permite construir uma cadeia de exceções.

3

get_text

Isso retorna a representação textual como uma string de acordo com o idioma do sistema da exceção.

4

get_longtext

Isso retorna a variante longa da representação textual da exceção como uma string.

5

get_source_position

Fornece o nome do programa e o número da linha alcançada onde a exceção foi levantada.

Exemplo

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.

Neste exemplo, se o número for maior que 150, a exceção CX_DEMO_ABS_TOO_LARGE é gerada. O código acima produz a seguinte saída para o número 160.

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