Tratamento de Erros no M. Access
No Access, 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 VBA 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 VBA 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 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.
FONTE:
Esse artigo tem como base o artigo do Gilberto Holms, "Tratamento de Erros no VB6"
Redação do Informe Access
No Access, 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 VBA 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 VBA 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 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.
FONTE:
Esse artigo tem como base o artigo do Gilberto Holms, "Tratamento de Erros no VB6"
Redação do Informe Access