Sobre instrução de erro (Visual Basic)
Permite uma rotina de tratamento de erros e especifica a localização da rotina dentro de um procedimento; também pode ser usado para desativar uma rotina de tratamento de erros. A On Error
instrução é usada no tratamento de erros não estruturados e pode ser usada em vez do tratamento de exceções estruturadas. O tratamento de exceções estruturadas é incorporado ao .NET, geralmente é mais eficiente e, portanto, é recomendado ao lidar com erros de tempo de execução em seu aplicativo.
Sem tratamento de erros ou tratamento de exceções, qualquer erro em tempo de execução que ocorra é fatal: uma mensagem de erro é exibida e a execução é interrompida.
Nota
A Error
palavra-chave também é usada na instrução de erro, que é suportada para compatibilidade com versões anteriores.
Sintaxe
On Error { GoTo [ line | 0 | -1 ] | Resume Next }
Partes
Termo | Definição |
---|---|
GoTo linha |
Habilita a rotina de tratamento de erros que começa na linha especificada no argumento de linha necessário. O argumento de linha é qualquer rótulo de linha ou número de linha. Se ocorrer um erro em tempo de execução, controle ramificações para a linha especificada, tornando o manipulador de erros ativo. A linha especificada deve estar no mesmo procedimento que a On Error instrução ou ocorrerá um erro em tempo de compilação. |
GoTo 0 |
Desabilita o manipulador de erros habilitado no procedimento atual e o redefine como Nothing . |
GoTo -1 |
Desabilita a exceção habilitada no procedimento atual e a redefine para Nothing . |
Resume Next |
Especifica que, quando ocorre um erro em tempo de execução, o controle vai para a instrução imediatamente após a instrução onde o erro ocorreu e a execução continua a partir desse ponto. Use este formulário em vez de On Error GoTo acessar objetos. |
Observações
Nota
Recomendamos que você use o tratamento de exceções estruturadas em seu código sempre que possível, em vez de usar o tratamento de exceções não estruturadas e a On Error
instrução. Para obter mais informações, consulte Tentar... Pegar... Finalmente Declaração.
Um manipulador de erro "habilitado" é aquele que é ativado por uma On Error
instrução. Um manipulador de erro "ativo" é um manipulador habilitado que está no processo de manipulação de um erro.
Se ocorrer um erro enquanto um manipulador de erros estiver ativo (entre a ocorrência do erro e uma Resume
instrução , Exit Sub
, Exit Function
, ou Exit Property
), o manipulador de erros do procedimento atual não poderá lidar com o erro. O controle retorna ao procedimento de chamada.
Se o procedimento de chamada tiver um manipulador de erros habilitado, ele será ativado para lidar com o erro. Se o manipulador de erros do procedimento de chamada também estiver ativo, o controle passará de volta pelos procedimentos de chamada anteriores até que um manipulador de erros habilitado, mas inativo, seja encontrado. Se nenhum manipulador de erro for encontrado, o erro será fatal no ponto em que realmente ocorreu.
Cada vez que o manipulador de erros passa o controle de volta para um procedimento de chamada, esse procedimento se torna o procedimento atual. Quando um erro é tratado por um manipulador de erros em qualquer procedimento, a execução é retomada no procedimento atual no ponto designado pela Resume
instrução.
Nota
Uma rotina de tratamento de erros não é um Sub
procedimento ou um Function
procedimento. É uma seção de código marcada por um rótulo de linha ou um número de linha.
Propriedade Number
As rotinas de tratamento de erros dependem do valor na Number
propriedade do Err
objeto para determinar a causa do erro. A rotina deve testar ou salvar valores de propriedade relevantes no Err
objeto 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 refletem apenas o Err
erro mais recente. A mensagem de erro associada está Err.Number
contida em Err.Description
.
Declaração de lançamento
Um erro gerado com o Err.Raise
método define a Exception
propriedade para uma instância recém-criada da Exception classe. A fim de apoiar o levantamento de exceções de tipos de exceção derivados, uma Throw
instrução é suportada no idioma. Isso usa um único parâmetro que é a instância de exceção a ser lançada. O exemplo a seguir mostra como esses recursos podem ser usados com o suporte existente à manipulação de exceções:
On Error GoTo Handler
Throw New DivideByZeroException()
Handler:
If (TypeOf Err.GetException() Is DivideByZeroException) Then
' Code for handling the error is entered here.
End If
Observe que a On Error GoTo
instrução interceta todos os erros, independentemente da classe de exceção.
No erro Retomar Seguinte
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 em tempo de execução, ou com a instrução imediatamente após a chamada mais recente fora do procedimento que contém a On Error Resume Next
instrução. Esta instrução permite que a execução continue apesar de um erro em tempo de execução. Você pode colocar a rotina de tratamento de erros onde o erro ocorreria em vez de transferir o controle para outro local dentro do procedimento. Uma On Error Resume Next
instrução torna-se inativa quando outro procedimento é chamado, portanto, você deve executar uma On Error Resume Next
instrução em cada rotina chamada se quiser tratamento de erros em linha dentro dessa rotina.
Nota
A On Error Resume Next
construção pode ser preferível ao On Error GoTo
ao manipular erros gerados durante o acesso a outros objetos. A verificação Err
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 no Err.Number
, bem como qual objeto originalmente gerou o erro (o objeto especificado em Err.Source
).
No erro GoTo 0
On Error GoTo 0
Desabilita o tratamento de erros no procedimento atual. Ele não especifica a linha 0 como o início do código de tratamento de erros, mesmo que o procedimento contenha uma linha numerada 0. Sem uma On Error GoTo 0
instrução, um manipulador de erros é automaticamente desativado quando um procedimento é encerrado.
No erro GoTo -1
On Error GoTo -1
desativa a exceção no procedimento atual. Ele não especifica a linha -1 como o início do código de tratamento de erros, mesmo que o procedimento contenha uma linha numerada -1. Sem uma On Error GoTo -1
instrução, uma exceção é automaticamente desativada quando um procedimento é encerrado.
Para evitar que o código de tratamento de erros seja executado quando nenhum erro tiver ocorrido, coloque uma Exit Sub
instrução , Exit Function
ou Exit Property
imediatamente antes da rotina de tratamento de erros, como no fragmento a seguir:
Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
On Error GoTo ErrorHandler
' Insert code that might generate an error here
Exit Sub
ErrorHandler:
' Insert code to handle the error here
Resume Next
End Sub
Aqui, o código de tratamento de erros segue a Exit Sub
instrução e precede a End Sub
instrução para separá-la do fluxo de procedimento. Você pode colocar o código de tratamento de erros em qualquer lugar em um procedimento.
Erros não capturados
Erros não intercetados em objetos são retornados ao aplicativo de controle quando o objeto está sendo executado como um arquivo executável. Dentro do ambiente de desenvolvimento, erros não intercetados são retornados para o aplicativo de controle somente se as opções adequadas forem definidas. Consulte a documentação do aplicativo host para obter uma descrição de quais opções devem ser definidas durante a depuração, como defini-las e se o host pode criar classes.
Se você criar um objeto que acessa outros objetos, você deve tentar lidar com quaisquer erros não tratados que eles passam de volta. Se não conseguir, mapeie os códigos de erro para um dos seus próprios erros e, em Err.Number
seguida, passe-os de volta para o chamador do seu objeto. Você deve especificar seu erro adicionando seu código de erro à VbObjectError
constante. Por exemplo, se o código de erro for 1052, atribua-o da seguinte forma:
Err.Number = vbObjectError + 1052
Atenção
Erros de sistema durante chamadas para bibliotecas de vínculo dinâmico (DLLs) do Windows não geram exceções e não podem ser presos com a captura de erros do Visual Basic. Ao chamar funções DLL, você deve verificar cada valor de retorno para sucesso ou falha (de acordo com as especificações da API) e, no caso de uma falha, verificar o valor na Err
propriedade do LastDLLError
objeto.
Exemplo
Este exemplo primeiro usa a On Error GoTo
instrução para especificar o local de uma rotina de tratamento de erros dentro de um procedimento. No exemplo, uma tentativa de dividir por zero gera o erro número 6. O erro é tratado na rotina de tratamento de erros e o controle é retornado para a instrução que causou o erro. A instrução desativa a On Error GoTo 0
captura de erros. Em seguida, a On Error Resume Next
instrução é usada para adiar a captura de erros para que o contexto do erro gerado pela próxima instrução possa ser conhecido com certeza. Observe que é usado para limpar as Err
propriedades do objeto depois que Err.Clear
o erro é manipulado.
Public Sub OnErrorDemo()
On Error GoTo ErrorHandler ' Enable error-handling routine.
Dim x As Integer = 32
Dim y As Integer = 0
Dim z As Integer
z = x / y ' Creates a divide by zero error
On Error GoTo 0 ' Turn off error trapping.
On Error Resume Next ' Defer error trapping.
z = x / y ' Creates a divide by zero error again
If Err.Number = 6 Then
' Tell user what happened. Then clear the Err object.
Dim Msg As String
Msg = "There was an error attempting to divide by zero!"
MsgBox(Msg, , "Divide by zero error")
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 6 ' Divide by zero error
MsgBox("You attempted to divide by zero!")
' Insert code to handle this error
Case Else
' Insert code to handle other situations here...
End Select
Resume Next ' Resume execution at the statement immediately
' following the statement where the error occurred.
End Sub
Requisitos
Espaço de nomes: Microsoft.VisualBasic
Assembly: Visual Basic Runtime Library (em Microsoft.VisualBasic.dll)