O que iremos cobrir? |
---|
|
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:
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.
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: # 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. .
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.
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.
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 |
---|
|
Em caso que tenhas alguma dúvida ou queiras comentar esta página
envia-me um e-mail para:
babyboy@oninet.pt