NO-ERROR não impede a ocorrência de erros

Escrito por Marcos Kirchner em 15 de fevereiro de 2010, 13:48h

Conforme a documentação do ABL / 4GL, a cláusula NO-ERROR apenas faz com que o erro não seja apresentado em tela. O erro ainda ocorre e deve ser tratado devidamente.

Alguns erros simplesmente não podem ser evitados. Por exemplo, um programa que conecta a um banco de dados em tempo de execução não tem uma forma simples de saber se o banco está ou não disponível. A melhor alternativa é tentar a conexão. Se o banco não estiver disponível ocorrerá um erro, mesmo com a cláusula NO-ERROR. A diferença é que com NO-ERROR não será exibida uma mensagem ao usuário e o programa terá oportunidade de tratar a situação adequadamente. Uma mensagem do tipo “O banco de dados está em manutenção neste momento” é mais útil ao usuário final do que algo como “** Could not connect to server for database XPTO, errno 0. (1432)”.

A cláusula NO-ERROR pode ser utilizada em vários comandos ABL (ASSIGN, CONNECT, CREATE, DISPLAY, FIND, etc). Em todos os casos em que o programa utiliza NO-ERROR, deve haver um teste para determinar se o comando executou corretamente. Se este teste não for realizado e ocorrer um erro, o programa provavelmente apresentará um comportamento inadequado. Poucas coisas são tão sem graça quando perder horas depurando (debugging) um programa apenas para descobrir que não havia um tratamento de erros adequado para um comando simples e aparentemente inofensivo.

E qual é, então, a forma correta de testar erros quando se utiliza o NO-ERROR? Utilizando o handle ERROR-STATUS. No caso do comando FIND também é muito utilizada a função AVAILABLE.

O handle ERROR-STATUS guarda informações sobre os erros ocorridos no último comando executado com NO-ERROR. Não há um histórico. A cada comando executado com NO-ERROR, as informações anteriores do ERROR-STATUS são descartadas.

Abaixo um exemplo simples de uso do ERROR-STATUS. Se ocorrer um erro na conversão para inteiro, será exibida a mensagem “erro” e o código do erro.

DEF VAR c AS CHAR.
DEF VAR i AS INT.
UPDATE c LABEL 'Número'.
ASSIGN i = INTEGER(c) NO-ERROR.
IF ERROR-STATUS:ERROR THEN
    DISP "Erro" ERROR-STATUS:GET-NUMBER(1).

Apesar de útil, o tratamento de erros com o handle ERROR-STATUS é maçante, pois é necessário verificar individualmente cada comando executado com NO-ERROR. A partir do OpenEdge 10.1C é possível utilizar tratamento estruturado de erros com blocos CATCH / FINALLY, de forma similar a algumas linguagens orientadas a objeto. Esta funcionalidade será abordada no próximo post.

Categorias: Programação | Progress

Comentar




biuquote
  • Comentário
  • Pré-visualização
Loading


Acesso LogMeIn

Informe o código PIN: