MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    Tratamento de Erros no M. Access

    Compartilhe
    avatar
    Jungli
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 641
    Registrado : 07/05/2010

    Tratamento de Erros no M. Access

    Mensagem  Jungli em Qua 22 Jun 2011, 11:54

    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


    .................................................................................
    "Somos o que repetidamente fazemos.
    A excelência, portanto, não é um feito,
    mas um hábito."

    Aristóteles

    rafaelbatistadasilva
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 40
    Registrado : 24/02/2014

    Re: Tratamento de Erros no M. Access

    Mensagem  rafaelbatistadasilva em Qui 08 Jun 2017, 02:27

    Há tempos que queria uma explicação completa e inteligível. Obrigado ao autor do texto e a quem compartilhou Jungli.

    Grande Abraço.

      Data/hora atual: Sab 24 Fev 2018, 13:59