Lidando com erros

O que iremos cobrir?
  • 2 formas de lidar com erros
  • criar erros nos nosso código, por forma a outros o corrijam

A maneira tradicional

De uma forma tradicional, quando os programadores fazem qualquer coisa, como por exemplo chamar uma função, o resultado dessa função pode ser testado, relativamente a sua validade. Um exemplo disso, é quando tentas abrir um ficheiro que não existe, o resultado aí pode ser valor NULL ou 0. Existem duas formas para lidar com este tipo de situações:

  1. incluir o código do erro no resultado da função ou então
  2. criar uma variável global, para lidar com os erros.

Em qualquer um dos casos, é da responsabilidade do programador verificar se ocorreu um erro, e se sim, tomar as devidas medidas.

Um exemplo no BASIC:

OPEN "A:\DATA.TXT" FOR INPUT AS #1
IF ERR = 53 THEN 
   CALL FileNotFoundError
ELSE
   REM CONTUNUAR O PROCESSAMENTO DO FICHEIRO
END IF

Este procedimento tem como resultado a produção de programas de grande qualidade, mas onde por vezes mais de metade do código, é para verificar se existem erros ou não. Isso torna a tarefa de um programador muito difícil e faz com que o código do programa seja de difícil interpretação (a realidade é que quase todos os programas de hoje em dia são assim). Uma boa abordagem é uma boa forma de evitar erros.

A maneira excepcional

Nas linguagens de programação mais recentes, surgiu um alternativa, para a forma de como lidar com erros. Isto é feito através das excepções incluídos dentro das funções. Quando se dá uma excepção o sistema obriga o programa a dar um salto para fora do bloco de código onde ocorreu o erro para o bloco de código onde se lidam com os erros. No próprio sistema existem formas de apanhar o erro, que depois de se lidar com ele o programa fecha.

A forma de excepção é muito parecido com o if/the/else:

try:
   # a lógica do programa fica aqui
except ExceptionType:
   # as execpções durante o processamento ficam aqui
except AnotherType:
   # um outro de tipo de excepções ficam aqui
else:
   # em caso que nenhuma das excepções tenha acontecido este é o bloco de código a seguir
try....finally. que usualmente utilizado por último, indiferentemente do que acontece na secção do try.
try:
   # a lógica do programa vai aqui
finally:
   # aqui arruma-se a casa independentemente
   # do sucesso/falha no bloco do try

O Tcl tem um mecanismo semelhante mas usando a palavra-chave catch:

set errorcode [catch {
    unset x
    } msg ]
if {$errorcode != 0} {
    # lidar com o erro aqui
    }

Neste caso como o x não existe portanto não podemos trabalhar com ele (unset). Então o Tcl abre uma excepção, mas o catch (apanha), não deixa que o programa aborte e em vez disso agarra na mensagem de erro e coloca-a na variável msg. Depois em caso que queiras analisar o erro ocorrido sempre podes ir ao errorcode e verificar.

O BASIC por sua vez não tem nenhum comando de que seja semelhante ao aos statements de excepção das outras duas linguagens mas em compensação tem uns truques que ajudam a manter o código o mais limpo possível:

100 OPEN "A:\Temp.dat" FOR INPUT AS #1
110 ON ERROR GOTO 10010
120 REM O CÓDIGO DO PROGRAMA AQUI...
130 ...
10000 REM ERRORHANDLERS:
10010 IF ERR = 54 THEN....

Repara na numeração das linhas. Isto é uma coisa que era muito comum antigamente na programação, hoje em dia pode-se fazer a mesma coisa usando as labels

ON ERROR GOTO Handler
REM AGORA CRIA UM MENSAGEM DE ERRO PARA DIVISÕES COM 0
x = 5/0
Handler:
   IF ERR = 23 THEN 
      PRINT "Não pode dividir por 0"
      x = 0
      RESUME NEXT
   END IF

Aqui peço que reparem no statement RESUME NEXT, que nos irá permitir voltar e continuar com programa mesmo que um erro tenha ocorrido. .

Criando erros

Então como é que podemos fazer para criar um erro num módulo para as outras pessoas possam apanha-lo e verificar? Quando queremos que tal aconteça basta usar a palavra-chave raise, isto no Python:

numerador = 42
denominador = input("Qual o valor pelo o qual irás dividir o 42?")
if denominador == 0:
   raise "denominador zero"

Isto cria uma string que define o erro, mas essa string pode ser capturada por bloco de código do tipo try/execption.

Os mecanismos do Tcl

O statement return pega em qualquer código opcional (criando pelo -code) e o código erróneo e agarrado pelo catch:

proc spam {val} {
        set x $val
        return -code 3 [expr $x]
        }
set err [catch {
               set foo [spam 7]
               } msg]

err deveria ter o valor de 3 e a variável msg o valor de 7. Mais um caso que e podemos verificar o que de intuitivo o Tcl não tem nada.

como O BASIC lida com os erros

No BASIC podes programar a variável ERR com o ERROR statement:

ON ERROR GOTO ERRORS
INPUT "INPUT ERROR CODE"; E
ERROR E

ERRORS:
IF ERR = 142 THEN
    PRINT "Error 142 found"
    STOP
ELSE
    PRINT "No error found"
    STOP
END IF


Pontos a lembrar
  • Podes verificar códigos erróneos usando o if statement
  • Apanha excepções nos erros usando blocos de excepção
  • Cria excepções usando a palavra-chave raise
  • Erros podem ser transformados em strings simples
Anterior  Próxima  Índice


Em caso que tenhas alguma dúvida ou queiras comentar esta página envia-me um e-mail para: babyboy@oninet.pt