Back-End

16 jun, 2007

Tratamento de Erros no VB6

Publicidade

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.