Tratamento
de Erros no VB6
Sábado, 16/06/2007
às 09h00, por Gilberto Augusto Thomaz de Aquino Holms
Tratamento de Erros no VB6
Quando programamos
em qualquer linguagem, é essencial que saibamos tratar os erros ou exceções que
nossa aplicação, por algum motivo, possa lançar. Algumas linguagens orientadas
a objetos utilizam blocos de try-catch para manipulação de erros. No Visual
Basic 6, o modo disponível para realizar esse tratamento é um pouco diferente.
No VB6, quando um
erro ocorre, é chamada uma rotina padrão para tratamento de erros interna da
própria linguagem, cuja função é exibir o número do erro seguido de sua
descrição e parar a execução do programa. Se você não fizer uma rotina
específica para tratar o erro, o VB utilizará essa rotina padrão (que por sinal
é bem famosa), que muitas vezes pode não só fazer o cliente pensar que você é
incompetente e fez alguma besteira no programa quanto corromper algum processo,
base de dados, arquivo ou conexão que estavam sendo utilizados no momento em
que ocorreu o erro.
Para realizar esse tratamento, o VB6 permite que usemos a instrução: On Error
Quando o programa
passa pela linha de instrução On Error, ele já sabe que, até o fim da
sub-rotina atual, se ocorrer algum erro após passar por esse comando, ele
deverá executar a instrução determinada pelo comando. Note que, se ocorrer um
erro em alguma linha anterior a essa instrução, o programa ainda assim lançará
o tratamento padrão. Note também que a instrução vale apenas para a sub-rotina
em execução.
Existem dois modos
de utilizar essa instrução:
Método 1:
On Error Resume Next
Neste caso, o
programa simplesmente ignorará o erro e continuará executando a sub-rotina a
partir da linha subseqüente ao erro. Não é muito recomendado, pois você não
está tratando o erro, e sim ignorando ele (afinal se um erro ocorreu é porque
existe alguma coisa errada, não podemos simplesmente ignorar, mas em alguns
poucos casos pode ser conveniente).
Exemplo de uso:
Private Sub
Command1_Click()
Dim X As Integer
On Error Resume Next
'Lançará um erro pois
tentamos converter letras em número:
X =
CInt("texto")
MsgBox "Passou
por aqui ?!"
End Sub
No exemplo acima, a
mensagem "Passou por aqui ?!" será exibida, simplesmente ignoramos o
erro ocorrido. Mas qual será o valor de X ? Imagine se ele fosse um valor vital
para alguma conta.
Método 2:
On Error GoTo label
Neste caso, na
ocorrência do erro o programa passará a execução para uma determinada linha da
sub-rotina identificada por uma label. Uma label é definida por um
identificador seguido de dois pontos ":" . Agora poderemos ter
controle total sobre o erro. Veja um exemplo:
Private Sub
Command1_Click()
Dim X As Integer
On Error GoTo
TrataErro
'Lançará um erro pois
tentamos converter letras em número:
X =
CInt("texto")
MsgBox "Passou
por aqui ?!"
Exit Sub
TrataErro:
If Err.Number = 13 Then
MsgBox "Erro de Conversão de Letra
para Número !"
End If
End Sub
Neste caso,
exibiremos nossa própria mensagem de erro, que pode ser mais amigável ao
usuário e não causará encerramento do programa. Quando passamos a execução para
o bloco de label TrataErro , foram lidas as respectivas instruções e a
sub-rotina foi encerrada. O comando Exit Sub serve para finalizar a execução da
sub-rotina antes que ela chegue ao End Sub (assim garantimos que a linha de
execução nunca alcançará nosso TrataErro caso não tenha ocorrido um erro).
Neste caso a mensagem "Passou por aqui ?!" não será exibida.
Porém, nem sempre queremos
finalizar a execução da sub-rotina quando ocorrer um erro. Neste caso podemos
realizar tratamentos mais funcionais utilizando os conceitos de Resume citados
anteriormente.Veja alguns exemplos:
Private Sub
Command1_Click()
Dim X As Integer
On Error GoTo
TrataErro
'Lançará um erro pois
tentamos converter letras em número:
X =
CInt("texto")
MsgBox "Passou
por aqui ?!"
Exit Sub
TrataErro:
If Err.Number = 13 Then
MsgBox "Erro de Conversão de Letra
para Número ! "
MsgBox "Adoraremos X = 0"
X = 0
Resume Next
End If
End Sub
Neste caso, o
comando Resume Next dentro do bloco de tratamento permite que consertemos o
erro e retomemos a execução para a linha subseqüente ao erro. Neste caso, o X
valerá zero e a mensagem "Passou por aqui ?!" será exibida.
Private Sub
Command1_Click()
Dim X As Integer
On Error GoTo
TrataErro
'Poderá lançar um
erro se Text1 tiver vazio ou contiver letras:
X = CInt(Text1.Text)
MsgBox "Passou
por aqui ?!"
Exit Sub
TrataErro:
If Err.Number = 13 Then
MsgBox "Erro de Conversão de Letra
para Número ! "
MsgBox "Adoraremos X = 0"
Text1.Text = "0"
Resume
End If
End Sub
O exemplo acima é
um caso de Resume sem o comando Next. Neste caso o programa retomará a execução
para a própria linha que havia dado erro. Porém é preciso tomar cuidado, pois
se o erro persistir o programa entrará em Loop infinito.
Private Sub Command1_Click()
Dim X As Integer
Dim Y As Integer
On Error GoTo
TrataErro
'Poderá lançar um erro se Text1 tiver vazio ou
contiver letras:
X = CInt(Text1.Text)
MsgBox "Passou por aqui ?!"
Y = 9 / X 'Poderá lançar um erro
se X valer zero
Exit Sub
TrataErro:
If Err.Number = 13 Then
Resume TrataErro13
ElseIf Err.Number = 11 Then
Resume TrataErro11
End If
TrataErro13:
MsgBox "Erro de Conversão de Letra para Número !
"
MsgBox "Adoraremos X = 1"
X = 1
Resume Next
TrataErro11:
MsgBox "Impossível dividir por zero ! "
MsgBox "Digite um novo valor para X"
Text1.Text = ""
Text1.SetFocus
Exit Sub
End Sub
No exemplo didático
mostrado acima, vemos que é possível dar um amplo tratamento de erro misturando
os conceitos de labels, Resume e Exit Sub.
Agora que já sabemos como manipular as exceções no VB6, vamos conhecer
um pouco melhor o objeto Err. Nos exemplos
vistos utilizamos apenas sua propriedade Number, que retorna o
número do erro ocorrido. Porém, esta classe apresenta outros membros muito
úteis:
Number
Descrição: Retorna o número do erro
Exemplo de Uso:
MsgBox Err.Number
Description
Descrição: Retorna
a descrição do erro
Exemplo de Uso:
MsgBox
Err.Description
Source
Descrição: Retorna o nome do objeto que lançou o erro
Exemplo de Uso:
MsgBox Err.Source
Raise(Number As Long, [source],[description])
Descrição: Lança um
erro (útil para testar rotinas em condições de erro)
Exemplo de Uso:
Err.Raise 10 ,
"RotinaTeste", "Erro de argumento inválido"
Clear
Descrição: Apaga as propriedades do objeto Err (propriedades que são
referentes ao último erro que foi lançado)Exemplo de Uso:
If Err.Number <> 0 Then
MsgBox Err.Number
Err.Clear
End If
Agora veremos um
pequeno resumo de como e quando utilizar os comandos de tratamento de erro numa
rotina:
Declaração do Tratamento de Erro
§ On Error Resume Next - Se ocorrer erro,
continua executando a partir da linha sub-seqüente à linha que o gerou (ignora
o erro)
§ On Error GoTo label - Se ocorrer um
erro, continua executando a partir da linha identificada pela label
Finalizando a Sub-Rotina
§ Exit Sub - Finaliza a execução da sub-rotina
(Sub)
§ Exit Function - Finaliza a execução da função
(Function)
§ Exit Property - Finaliza a execução da propriedade
da classe (Property)
§ End - Finaliza a execução do programa
No Bloco de Tratamento de Erro
§ Resume - Executa novamente a linha que gerou
o erro
§ Resume Next - Executa a linha sub-seqüente à
linha que gerou o erro
§ Resume label - Executa a partir da linha
identificada pela label
Tome as rédeas do
seu aplicativo. Sempre procure tratar todos os erros possíveis, assim você
evitará dores de cabeça no futuro. Até o próximo artigo.
Nenhum comentário:
Postar um comentário