Tratamento de Exceção – Propagação e CLEANUP

Quando eu explico tratamento de exceção na academia ABAP, o pessoal não dá muita bola, até porque os alunos ainda estão tentando se recuperar das aulas de polimorfismo e interface, mas entender o funcionamento dela é vital para desenvolver boas soluções usando orientação a objetos (não somente para aprender a escrever a palavra exceção).

Nesse post, vou explicar dois conceitos ligado ao tratamento de exceções baseado em classes, propagação e comando CLEANUP.

Começando Pelo Básico

Vamos entender primeiro o funcionamento básico do tratamento de exceções baseado em classes. Quando usamos as classes de exceção, devemos usar a estrutura de comandos TRY-CATCH-CLEANUP.

Usarei a classe LCL_EXCEPTION_DEMO que está no include ZABAP101_EXCEPTION_CLASSES nos programas de exemplo.

O primeiro programa que mostrarei é um programa cuja saída é … um DUMP!? Sim, quando o sistema chega a alguma situação onde ele não consegue seguir com o programa, como por exemplo uma divisão por zero.

Quando o programa tenta fazer uma divisão por zero a seguinte tela é mostrada. Toda a pilha de execução é eliminada e toda a memória usada pelo programa é apagada.

Mas graças ao tratamento de exceção por classes, você pode dizer para o sistema “tente executar essa operação, e se caso aconteça divisão por zero, execute isso”.

Nesse primeiro programa onde o DUMP é evitado, o método SIMPLE_CATCH( ) é chamado. Na implementação do método, ele tenta (TRY) executar uma divisão por zero, que é tratada (CATCH) dentro do próprio método.

Repare que a a exceção é tratada dentro do próprio método, portanto a mensagem “Executou o CATCH do método SIMPLE_CATCH.” é impressa no lugar do DUMP. A saída do programa acima é mostrada abaixo:

Propagação de Exceção

Conheço muitas equipes onde esse conceito é muito bem difundido, ou seja, uma pessoa decide não ser responsável pelo erro que cometeu e decide passar o erro para outra pessoa corrigir. Pois é, no ABAP temos algo parecido. Veja esse programa:

Quando o método PROPAGATING( ) é chamado, uma divisão por zero é executada. Observe que esta divisão não está sendo tratada com o TRY-CATCH e veja a saída do programa:

O segredo está na declaração do método: “METHODS propagating RAISING cx_sy_zerodivide.” Existe uma instrução RAISING que diz exatamente o que algumas pessoas que conheço fazem, “olha, pode ser que uma divisão por zero aconteça e se isso acontecer você [quem está chamando o método] deverá tratar essa exceção”.

Sendo assim, a exceção precisou ser tratada na chamada do método e não mais dentro do método.

Qual forma usar, a do primeiro programa ou essa? Depende. Se você quer passar a responsabilidade do tratamento para quem chama o método então o segundo programa deve ser usado. Mas se o erro é algo interno do método e precisa ser tratado de maneira transparente do usuário, então você deverá tratar a exceção dentro do próprio método, assim como fora feito no primeiro programa.

O que acontece se não tratarmos a exceção na chamada do método? Experimente…

CLEANUP não é WHEN OTHERS do Tratamento de Exceções

Essa é a primeira conclusão que os meus alunos chegam quando olham para definição do comando no Help do ABAP.

Não, o CLEANUP não é uma espécie de WHEN OTHERS do TRY-CATCH. Para ilustrar o uso do CLEANUP, veja o programa abaixo:

O objetivo do CLEANUP é para a limpeza de variáveis (memória) quando acontece uma exceção que será propagada. Seria o equivalente ao “quero limpar a bagunça antes de passar a exceção para ser tratada por quem chamou o método”. Pela saída do programa, você consegue entender a sequência de execução do programa. Ocorre a exceção, o CLEANUP é executado e então o CATCH no programa principal.

CLEANUP Morto

O CLEANUP somente é usado para “limpar a bagunça” quando a exceção está sendo propagada. No programa abaixo, o CLEANUP nunca será chamado.

Na saída do programa vemos claramente que o sistema não executou o CLEANUP, pois a divisão por zero é tratada dentro do próprio método.

Conclusão

Os conceitos de tratamento de exceção por classes não fica somente nisso, mas nesse post quis apenas expor os conceitos de propagação e CLEANUP. Para o uso correto de classes de exceções, é necessário entender encadeamento de exceções, hierarquia de exceções e textos da exceção. Isso será explorado em futuros posts.

Aprenda a usar corretamente as classes de exceções e você entregará programas muito elegantes e de fácil manutenção.

 

You may also like...

4 Responses

  1. Guilherme Fujii says:

    Muito bom Furlan, não conhecia o CLEANUP, o meu próximo passo é estudar um pouco as classes de excessão, no mesmo formato que o pessoal usa no ABAP2XLSX por exemplo…
    Voce recomenda algum material, livro ou site para estudos? Como as técnicas de MVC, Singletoon, essa parte ligada a orientação a objetos…

    Abraços!

  2. Guilherme Fujii says:

    Ops, exceção!

  3. Tim says:

    Muito bom os exemplos.
    Como sempre o site com exemplos muito bem explicados!
    E quanto mais OO melhor 😉 Que venha mais..

    Parabéns!