Instrução On Error
Habilita uma rotina de tratamento de erro e especifica a localização de rotina dentro de um procedimento; também pode ser usado para desabilitar uma rotina de tratamento de erro.
Sintaxe
On Error GoTo line (Na linha GoTo do Erro)
On Error Resume Next
On Error GoTo 0
A sintaxe da instrução On Error pode ter qualquer um dos seguintes formatos:
Instrução | Descrição |
---|---|
On Error GoTo line (Na linha GoTo do Erro) | Ativa a rotina de processamento de erros que começa na linha especificada no argumentode linha necessário. O argumento linha é qualquer rótulo de linha ou número da linha. Se ocorrer um erro de tempo de execução, o controle será ramificado para a linha, ativando o manipulador de erro . A linha especificada deve estar no mesmo procedimento que a instrução On Error; caso contrário, ocorrerá um erro de tempo de compilação. |
On Error Resume Next | Especifica que, quando ocorrer um erro de tempo de execução, o controle irá para a instrução imediatamente após a instrução em que o erro ocorreu e a execução continuará nela. Use esse formato em vez de On Error GoTo ao acessar objetos. |
On Error GoTo 0 | Desabilita qualquer manipulador de erro habilitado no procedimento atual. |
Comentários
Se você não usa uma instrução On Error, qualquer erro de tempo de execução que ocorrer será fatal; ou seja, uma mensagem de erro é exibida e a execução é interrompida.
Um manipulador de erro "habilitado" é aquele que é ativado por uma instrução On Error; um manipulador de erro "ativo" é um manipulador habilitado que está manipulando um erro. Se ocorrer um erro enquanto um manipulador de erro estiver ativo (entre a ocorrência do erro e uma instrução Resume, Exit Sub, Exit Function ou Exit Property), o manipulador de erro do procedimento atual não poderá manipular o erro. O controle retorna ao procedimento de chamada.
Se o procedimento de chamada tiver um manipulador de erro habilitado, será ativada para manipular o erro. Se o manipulador de erro do procedimento de chamada também estiver ativo, o controle regredirá pelos procedimentos de chamada anteriores até ser encontrado um manipulador de erro habilitado, mas inativo. Se nenhum manipulador de erro inativo habilitado for encontrado, o erro será fatal no ponto em que realmente ocorreu.
Sempre que o manipulador de erro passa o controle de volta para um procedimento de chamada, esse procedimento se torna o procedimento atual. Depois que um erro é manipulado por um manipulador de erro em qualquer procedimento, a execução é retomada no procedimento atual no ponto designado pela instrução Resume.
Observação
Uma rotina de tratamento de erro não é um procedimento Sub nem Function. É uma secção de código marcada por uma etiqueta de linha ou número de linha.
Rotinas de tratamento de erro se baseiam no valor na propriedade Number do objeto Error para determinar a causa do erro. A rotina de tratamento de erro deve testar ou salvar os valores de propriedade relevantes no objeto Error antes que qualquer outro erro possa ocorrer ou antes que um procedimento que possa causar um erro seja chamado. Os valores de propriedade no objeto Error refletem apenas o erro mais recente. A mensagem de erro associada a Err.Number está contida em Err.Description.
On Error Resume Next faz com que a execução continue com a instrução imediatamente após a instrução que causou o erro de tempo de execução ou com a instrução imediatamente após a chamada mais recente do procedimento que contém a instrução On Error Resume Next. Essa instrução permite que a execução continue apesar de um erro de tempo de execução. Você pode colocar a rotina de tratamento de erro onde o erro ocorreria, em vez de transferir o controle para outro local dentro do procedimento. Uma instrução On Error Resume Next se tornará inativa quando outro procedimento for chamado. Portanto, você deverá executar uma instrução On Error Resume Next em cada rotina chamada se quiser ter o tratamento de erro embutido dentro dessa rotina.
Observação
A construção On Error Resume Next pode ser preferível a On Error GoTo ao manipular erros gerados durante o acesso a outros objetos. VerificarErr após cada interação com um objeto remove a ambiguidade sobre qual objeto foi acessado pelo código. Você pode ter certeza de qual objeto colocou o código de erro em Err. Number, bem como o objeto que originalmente gerou o erro (objeto especificado no Err.Source).
On Error GoTo 0 desabilita o tratamento de erro no procedimento atual. Ele não especifica a linha 0 como o início do código de tratamento de erro, mesmo que o procedimento contenha uma linha numerada como 0. Sem uma instrução On Error GoTo 0, um manipulador de erro é desabilitado automaticamente quando um procedimento é encerrado.
Para impedir que o código de tratamento de erro seja executado quando nenhum erro tiver ocorrido, inclua uma instrução Exit Sub, Exit Function ou Exit Property imediatamente antes da rotina de tratamento de erro, como no seguinte fragmento :
Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ErrorHandler
. . .
Exit Sub
ErrorHandler:
. . .
Resume Next
End Sub
Aqui, o código de tratamento de erro vem após a instrução Exit Sub e antecede a instrução End Sub para separá-lo do fluxo de procedimento. O código de tratamento de erro pode ser colocado em qualquer lugar em um procedimento.
Erros não interceptados em objetos são retornados para o aplicativo de controle quando o objeto é executado como um arquivo executável. No ambiente de desenvolvimento, erros não interceptados serão retornados para o aplicativo de controle apenas se as opções adequadas forem definidas. Confira a documentação do aplicativo de host para obter uma descrição das opções que devem ser definidas durante a depuração, como defini-las e se o host pode criar classes.
Se criar um objeto que acessa outros objetos, você deverá tentar manipular os erros passados de volta por eles sem tratamento. Se você não puder manipular esses erros, mapeie o código de erro em Err.Number para um de seus próprios erros e passe-os de volta para o chamador do objeto. Você deve especificar o erro adicionando o código de erro à constante vbObjectError. Por exemplo, se o código de erro for 1052, atribua-o da seguinte maneira:
Err.Number = vbObjectError + 1052
Observação
Os erros de sistema durante chamadas para bibliotecas de ligação dinâmica (DLL) do Windows ou recursos de código macintosh não geram exceções e não podem ser apanhados com a interceção de erros do Visual Basic. Ao chamar funções de DLL, você deve verificar cada valor de retorno para determinar se houver êxito ou falha (de acordo com as especificações da API) e, em caso de falha, verificar o valor na propriedade LastDLLError do objeto Err. LastDLLError sempre retorna zero no Macintosh.
Exemplo
Este exemplo usa primeiro a instrução On Error GoTo para especificar o local de uma rotina de tratamento de erro dentro de um procedimento. No exemplo, uma tentativa de excluir um arquivo aberto gera o erro número 55. O erro é manipulado na rotina de tratamento de erro, e o controle é então retornado à instrução que causou o erro. A instrução On Error GoTo 0 desativa a interceptação de erro.
Em seguida, a instrução On Error Resume Next é usada para adiar a interceptação de erro para que o contexto do erro gerado pela próxima instrução possa ser conhecido com certeza. Err.Clear é usado para limpar as propriedades do objeto Err depois que o erro é manipulado.
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler ' Enable error-handling routine.
Open "TESTFILE" For Output As #1 ' Open file for output.
Kill "TESTFILE" ' Attempt to delete open
' file.
On Error Goto 0 ' Turn off error trapping.
On Error Resume Next ' Defer error trapping.
ObjectRef = GetObject("MyWord.Basic") ' Try to start nonexistent
' object, then test for
'Check for likely Automation errors.
If Err.Number = 440 Or Err.Number = 432 Then
' Tell user what happened. Then clear the Err object.
Msg = "There was an error attempting to open the Automation object!"
MsgBox Msg, , "Deferred Error Test"
Err.Clear ' Clear Err object fields
End If
Exit Sub ' Exit to avoid handler.
ErrorHandler: ' Error-handling routine.
Select Case Err.Number ' Evaluate error number.
Case 55 ' "File already open" error.
Close #1 ' Close open file.
Case Else
' Handle other situations here...
End Select
Resume ' Resume execution at same line
' that caused the error.
End Sub
Confira também
Suporte e comentários
Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.