MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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


2 participantes

    Tratamento de Erros no M. Access

    Jungli
    Jungli
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

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

    Tratamento de Erros no M. Access Empty Tratamento de Erros no M. Access

    Mensagem  Jungli 22/6/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

    jachornung gosta desta mensagem

    avatar
    rafaelDev
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

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

    Tratamento de Erros no M. Access Empty Re: Tratamento de Erros no M. Access

    Mensagem  rafaelDev 8/6/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: 15/5/2024, 12:00