CAPÍTULO 7
TRATAMENTO DE ERROS
Se fôssemos capazes de
desenvolver programas perfeitos, e se os usuários fossem
perfeitos, e se o Usinas fosse perfeito, então não
precisaríamos nos preocupar com tratamento de erros.
Infelizmente, no Usinas em que vivemos arquivos
desaparecem misteriosamente, disquetes não estão
posicionados quando necessário e os usuários fazem o
possível para descobrir novas formas de
"travar" o seu programa. Sem rotinas de
tratamento de erros, qualquer erro deste tipo seria
fatal, isto é, acarretaria na interrupção do programa.
Existem basicamente três
tipos de erros que podem ocorrer em um programa:
- Erros
de sintaxe:
Estes erros ocorrem durante a escrita e
depuração de programas e geralmente não afetam
o usuário final. Entretanto, se você não
estiver compilando em código nativo, pode ser
que alguns erros de sintaxe só aparecam durante
a execução. Isto ocorre porque na
"compilação" em pseudo-código o VB
não monta realmente o programa, pois trata-se de
uma execução interpretada.
- Erros
de execução: Este tipo de erros ocorrem em
programas perfeitos do ponto de vista sintático,
mas falhos do ponto de vista de tratamento de
erros. Erros de execução ocorrem quando
dispositivos não podem ser acessados, etc.
- Erros
de lógica:
Estes são os piores. Embora a sintaxe possa
estar perfeita, se a lógica do programa não
estiver bem planejada é possível que o
computador entre por um longo caminho sem volta,
como é o caso dos famosos "loops
infinitos".
ERROS
ACUSÁVEIS
Erros acusáveis são
aqueles detectados pelo VB em tempo de compilação ou
execução. Os mais comuns são mostrados na tabela 19 abaixo.
Tabela
19 - Erros acusáveis mais comuns
Código |
Descrição |
Descrição
em português |
3 |
Return without GoSub |
Return sem GoSub |
5 |
Invalid procedure call |
Chamada inválida de procedimento |
6 |
Overflow |
Sobrecarga |
7 |
Out of memory |
Falta de memória |
9 |
Subscript out of range |
Subescrito fora do intervalo |
10 |
This array is fixed or temporarily
locked |
Este array é fixo ou
temporariamente travado |
11 |
Division by zero |
Divisão por zero |
13 |
Type mismatch |
Tipo incorreto |
14 |
Out of string space |
Falta de espaço no string |
16 |
Expression Too Complex |
Expressão muito complexa |
17 |
Can't perform requested operation |
Impossível realizar a operação
requisitada |
18 |
User interrupt occurred |
Interrupção do usuário |
20 |
Resume without error |
Continuar sem erro |
28 |
Out of Stack Space |
Sem espaço na
pilha |
35 |
Sub, Function, or Property not
defined |
Sub, Função ou propriedade não
definida |
47 |
Too many DLL application clients |
Demasiados aplicativos DLL clientes |
48 |
Error in loading DLL |
Erro no carregamento de DLL |
49 |
Bad DLL calling convention |
Má convenção de chamada de DLL |
51 |
Internal error |
Erro interno |
52 |
Bad file name or number |
Número ou nome de arquivo incorreto |
53 |
File not found |
Arquivo não encontrado |
54 |
Bad file mode |
Modo de arquivo incorreto |
55 |
File already open |
Arquivo jã aberto |
57 |
Device I/O error |
Erro de dispositivo de
entrada/saída |
58 |
File already exists |
Arquivo já existe |
59 |
Bad record length |
Tamanho de registro incorreto |
61 |
Disk full |
Disco cheio |
62 |
Input past end of file |
Entrada depois do fim do arquivo |
63 |
Bad record number |
Número de registro incorreto |
67 |
Too many files |
Arquivos em damasia |
68 |
Device unavailable |
Dispositivo inacessível |
70 |
Permission denied |
Permissão nagada |
71 |
Disk not ready |
Disco não pronto |
74 |
Can't rename with different drive |
Impossível renomear com drive
diferente |
75 |
Path/File access error |
Erro de acesso a caminho ou arquivo |
76 |
Path not found |
Caminho não encontrado |
91 |
Object variable or With block
variable not set |
Variável objeto ou bloco With não
definida |
92 |
For loop not initialized |
Laço For não inicializado |
93 |
Invalid pattern string |
Padrão de string inválido |
94 |
Invalid use of Null |
Uso inválido de Null |
444 |
Method not applicable in this
context |
Métod não aplicável neste
contexto |
452 |
Invalid ordinal |
Ordinal inválido |
453 |
Specified DLL function not found |
Função DLL especificada não
encontrada |
457 |
Duplicate Key |
Chave duplicada |
460 |
Invalid Clipboard format |
Formato do Clipboard inválido |
461 |
Specified format doesn't match
format of data |
Formato especificado não casa com
formato do dado |
480 |
Can't create AutoRedraw image |
Impossível criar imagem AutoRedraw |
481 |
Invalid picture |
Figura inválida |
482 |
Printer error |
Erro de impressão |
483 |
Printer driver does not support
specified property |
Driver de impressão não suporta a
proprieadade especificada |
484 |
Problem getting printer information
from the system. Make sure the printer is set up
correctly |
Problemas em conseguir informação
da impressora do sistema. Certifique-se de que a
impressora está configurada corretamente. |
485 |
Invalid picture type |
Tipo de figura inválida |
520 |
Can't empty Clipboard |
Impossível esvaziar o Clipboard |
521 |
Can't open Clipboard |
Impossível abrir o Clipboard |
A
INSTRUÇÃO "On Error"
Qualquer gerenciador de
erros começa com esta instrução, que admite as
seguintes formas de sintaxe:
On
Error GoTo linha: a execução do código é
desviada para o rótulo descrito pelo parâmetro linha.
Rótulos são identificadores não executáveis e são
inseridos digitando-se dois pontos no final do nome. Por
exemplo: Rótulo:.Quando se usa esta instrução, o
rótulo identifica o início de uma rotina de tratamento
de erros.
- On
Error Resume Next: a execução é desviada para a
instrução imediatamente subsequente àquela que
gerou o erro.
- On Error
GoTo 0:
desabilita qualquer gerenciador de erros ativo na
procedure atual.
Uma rotina de tratamento
de erros não é uma rotina do tipo Sub ou Function, mas
sim um bloc de código identificado por um rótulo.
O
OBJETO "Err"
Este objeto contém
informações sobre erros em tempo de execução. A
propriedade padrão é Number, que é um valor correspondente a um
número válido de erro. Quando um erro ocorre, a
seguinte sintaxe pode ser usada para acessar o número do
erro: Err.Number.
A
FUNÇAO "Error"
Esta função retorna uma
mensagem de erro que corresponde a um número de erro
especificado.
Sintaxe:
Error[(Número_Do_Erro)}
Se o parâmetro
Número_Do_Erro for omitido, a função retornará o
número do erro mais recente. Se Número_Do_Erro for
inválido, um erro ocorrerá. As mensagens retornadas por
esta função são expressas em inglês, naturalmente.
Para obter as mensagens em português você deve
implementar um gerenciador que capture o número do erro
e exiba a mensagem traduzida.
O
MÉTODO "Raise"
Este método do objeto
Err simula um erro em tempo de
execução e é ótimo para se verificar o funcionamento
de rotinas de tratamento de erros.
Sintaxe:
Err.Raise Número_Do_Erro
A instrução Error (Visual Basic 3.0) ainda é
aplicável, mas apenas por compatibilidade. Para escrever
programas que possam ser compilados por futuras versões
do VB é preferível usar sempre os métodos e
propriedades do objeto Err.
Exemplo:
Este exemplo primeiro
usa a instrução On Error GoTo para especificar a localização de uma
rotina de tratamento de erros dentro de uma procedure. No
exemplo, uma tentativa é feita de se deletar um arquivo
aberto, gerenado-se o erro número 55. O controle é
então enviado para o comando que causou o erro e o
comando On Error GoTo 0 desliga o tratamento de erros.
Sub
OnErrorStatementDemo()
On Error GoTo ErrorHandler ' Habilita o
trataemento de erros.
Open "TESTFILE" For Output As #1 ' Abre um
arquivo para saída
Kill "TESTFILE" ' Tenta
deletar o arquivo
On Error Goto 0
'
Desabilita o tratamento de erros.
On Error
Resume Next
ObjectRef = GetObject("MyWord.Basic") ' Tenta
inicializar um objeto inexistente.
If Err.Number =
440 Or Err.Number = 432 Then
Msg = "Houve um erro tentando abrir o objeto !"
MsgBox Msg, , "Teste de erros"
Err.Clear ' Apaga os campos do objeto Err.
End If
Exit Sub ' Abandona o procedimento para evitar
a rotina de erros.
ErrorHandler: ' Rotina de
tratamento de erros.
Select Case Err.Number ' Obtém o número do erro.
Case 55 ' Arquivo já
aberto.
Close #1 '
Fecha o arquivo.
Case Else
' Insira
outras situações aqui...
End
Select
Resume ' Continua a
execução na mesma linha que causou o erro.
End
Sub
Copyright © 1998/1999 - Desenvolvido por
Alvaro Augusto de Almeida (isso significa que você pode
manter cópias para uso
particular, mas não para divulgação). Dúvidas e
sugestões serão bem vindas.
|