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