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.