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
GoTolinha 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 Resumeinstruçã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 Subinstrução , Exit Functionou 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 nome:Microsoft.VisualBasic

Assembly: Visual Basic Runtime Library (em Microsoft.VisualBasic.dll)

Consulte também