ASSERT vs Excepção

images/thumbnail.jpg - Thumbnail

Quem lê o Abapinho sabe quanto gosto de classes de excepções. No entanto, este não é o único mecanismo que o ABAP disponibiliza para controlo de erros.

Há outro, chamado ASSERT, que devia ser mais usado, e que hoje trago à baila.

O que é o ASSERT? É um comando que “reclama” uma determinada condição. Se a condição for verdadeira, tudo bem, não acontece nada. Se, for falsa… DUMP. E ao contrário das classes de excepção, não há forma de evitar este DUMP. E isso é bom.

Exemplo:

ASSERT 1 = 0.

DUMP!

Mas existem dois mecanismos para a mesma coisa? Como decidir qual usar?

A regra é esta:

  • Usa ASSERT para garantir que o código está correctamente escrito

  • Usa excepções para controlar erros de execução

Ficaste confuso? Exemplifiquemos:

Exemplo 1. O método DIVIDE( A, B ) divide A por B. Sabemos que se B for zero dá asneira matemática. Mas este erro depende da valor que for atribuído a B durante a execução. Como tal, deve ser controlado com uma excepção.

Exemplo 2. O método OPEN_FILE( F ) abre um ficheiro. Mas se o ficheiro não existir não temos nada para abrir. Isto é novamente um erro de execução porque depende do valor de F. Deve ser controlado com uma excepção.

Exemplo 3. Uma classe para fazer FTP tem um método FTP->SETUP( SERVER, PORT ) e um método FTP->OPEN(). A forma correcta de usar esta classe obriga a que antes de fazer OPEN() se use o método SETUP() para definir qual o servidor destino. No entanto um programa que a está a usar chama o método OPEN() antes de chamar o método SETUP(). Este programa está mal escrito e, como tal, nunca vai funcionar. O método OPEN() deverá fazer um ASSERT para verificar que o SETUP() já foi chamado como é devido. Mais à frente pode também usar uma excepção para tratar a possibilidade de a conecção não ser aberta com sucesso, algo que é já um erro de execução e que pode ou não acontecer dependendo das circunstâncias.

Um ASSERT falhado é sempre resultado de um bug.. Já uma excepção pode ser apenas resultado das circunstâncias (dados inválidos do utilizador, falha temporária na infra-estrutura, etc).

Portanto: idealmente uma classe deverá usar ASSERTs para garantir que está correctamente programada e que quem a usa está a fazê-lo correctamente.

Uma boa aplicação de ASSERTS torna a classe mais robusta porque permite identificar imediatamente bugs que de outra forma poderiam passar despercebidos.

O ASSERT pode ser usado de forma isolada ou associado a um CHECKPOINT GROUP conforme foi já explicado aqui.

O Abapinho saúda-vos.