Поделиться через


Оператор On Error (Visual Basic)

Включает подпрограмму обработки ошибок и указывает расположение подпрограммы в рамках процедуры; также можно использовать для отключения подпрограммы обработки ошибок. Инструкция On Error используется в неструктурированной обработке ошибок и может использоваться вместо структурированной обработки исключений. Структурированная обработка исключений встроена в .NET, как правило, более эффективна и поэтому рекомендуется при обработке ошибок среды выполнения в приложении.

Без обработки ошибок или обработки исключений любая ошибка во время выполнения, возникающая неустранимая: отображается сообщение об ошибке и останавливается выполнение.

Примечание.

Ключевое Error слово также используется в инструкции error, которая поддерживается для обратной совместимости.

Синтаксис

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Детали

Термин Определение
GoToлиния Включает подпрограмму обработки ошибок, которая начинается с строки, указанной в требуемом аргументе строки . Аргумент строки — это любая метка строки или номер строки. Если возникает ошибка во время выполнения, управляйте ветвями в указанной строке, что делает обработчик ошибок активным. Указанная строка должна находиться в той же процедуре, что On Error и инструкция или ошибка во время компиляции.
GoTo 0 Отключает обработчик ошибок в текущей процедуре и сбрасывает его Nothingв .
GoTo -1 Отключает исключение в текущей процедуре и сбрасывает его Nothingв .
Resume Next Указывает, что при возникновении ошибки во время выполнения элемент управления переходит к инструкции сразу после инструкции, в которой произошла ошибка, и выполнение продолжается с этого момента. Используйте эту форму, а не On Error GoTo при доступе к объектам.

Замечания

Примечание.

Мы рекомендуем по возможности использовать структурированную обработку исключений в коде, а не использовать неструктурированную обработку исключений и инструкцию On Error . Дополнительные сведения см. в разделе Оператор Try...Catch...Finally.

Обработчик ошибок "включено" — это обработчик ошибок, включенный оператором On Error . Обработчик ошибок "активный" — это включенный обработчик, который находится в процессе обработки ошибки.

Если ошибка возникает, когда обработчик ошибок активен (между вхождением ошибки и оператором ResumeExit Sub, Exit Functionили Exit Property оператором), обработчик ошибок текущей процедуры не может обработать ошибку. Элемент управления возвращается в вызывающую процедуру.

Если в вызывающей процедуре включен обработчик ошибок, он активируется для обработки ошибки. Если обработчик ошибок вызова также активен, элемент управления передается через предыдущие вызывающие процедуры, пока не включен, но неактивный обработчик ошибок не найден. Если такой обработчик ошибок не найден, ошибка неустранима в точке, в которой она на самом деле произошла.

Каждый раз, когда обработчик ошибок передает управление вызывающей процедуре, эта процедура становится текущей процедурой. После обработки ошибки обработчиком ошибок в любой процедуре выполнение возобновляется в текущей процедуре в точке, указанной инструкцией Resume .

Примечание.

Подпрограмма обработки ошибок не является процедурой Sub или процедурой Function . Это раздел кода, помеченный меткой строки или номером строки.

Свойство Number

Подпрограммы обработки ошибок зависят от значения в Number свойстве Err объекта, чтобы определить причину ошибки. Подпрограмма должна проверять или сохранять соответствующие значения свойств в Err объекте до возникновения любой другой ошибки или перед вызовом процедуры, которая может вызвать ошибку. Значения свойств в объекте Err отражают только последнюю ошибку. Сообщение об ошибке, связанное с Err.Number ним, содержится в Err.Description.

Оператор Throw

Ошибка, возникающая при использовании Err.Raise метода, задает Exception свойству только что созданный экземпляр Exception класса. Для поддержки создания исключений производных типов Throw исключений оператор поддерживается на языке. При этом создается один параметр, который является экземпляром исключения. В следующем примере показано, как эти функции можно использовать с существующей поддержкой обработки исключений:

    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

Обратите внимание, что On Error GoTo оператор перехватывает все ошибки независимо от класса исключений.

При следующем возобновлении ошибки

On Error Resume Next Приводит к продолжению выполнения инструкции сразу после инструкции, вызвавшей ошибку во время выполнения, или с инструкцией сразу после последнего вызова процедуры, содержащей инструкцию On Error Resume Next . Эта инструкция позволяет продолжить выполнение, несмотря на ошибку во время выполнения. Вы можете разместить подпрограмму обработки ошибок, в которой произошла ошибка, а не передавать управление в другое расположение в рамках процедуры. Оператор On Error Resume Next становится неактивным при вызове другой процедуры, поэтому следует выполнить On Error Resume Next инструкцию в каждой вызываемой подпрограмме, если требуется встроенная обработка ошибок в рамках этой подпрограммы.

Примечание.

Конструкция On Error Resume Next может быть предпочтительнее On Error GoTo при обработке ошибок, создаваемых во время доступа к другим объектам. Проверка Err после каждого взаимодействия с объектом удаляет неоднозначность, к которой был доступ к объекту в коде. Вы можете убедиться, в какой объект помещается код Err.Numberошибки, а также какой объект первоначально создал ошибку (объект, указанный в Err.Source).

При ошибке GoTo 0

On Error GoTo 0 отключает обработку ошибок в текущей процедуре. Он не указывает строку 0 в качестве начала кода обработки ошибок, даже если процедура содержит нумерованную строку 0. Без инструкции On Error GoTo 0 обработчик ошибок автоматически отключается при завершении процедуры.

При ошибке GoTo -1

On Error GoTo -1 отключает исключение в текущей процедуре. Он не указывает строку -1 в качестве начала кода обработки ошибок, даже если процедура содержит нумерованную строку -1. Без инструкции On Error GoTo -1 исключение автоматически отключается при завершении процедуры.

Чтобы предотвратить выполнение кода обработки ошибок при отсутствии ошибки, поместите Exit SubExit Functionинструкцию или Exit Property инструкцию непосредственно перед подпрограммой обработки ошибок, как показано в следующем фрагменте:

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

Здесь код обработки ошибок следует Exit Sub инструкции и предшествует End Sub инструкции, чтобы отделить ее от потока процедуры. Код обработки ошибок можно разместить в любом месте процедуры.

Незатраченные ошибки

Необнаруженные ошибки в объектах возвращаются в управляющее приложение при запуске объекта в качестве исполняемого файла. В среде разработки неоттрафованные ошибки возвращаются в управляющее приложение только в том случае, если заданы правильные параметры. Ознакомьтесь с документацией ведущего приложения, чтобы узнать, какие параметры следует задать во время отладки, как задать их, а также определить, может ли узел создавать классы.

Если вы создаете объект, который обращается к другим объектам, следует попытаться обработать необработанные ошибки, которые они передают обратно. Если вы не можете сопоставить коды ошибок с Err.Number одним из собственных ошибок, а затем передать их обратно вызывающему объекту. Необходимо указать ошибку, добавив код ошибки в константу VbObjectError . Например, если код ошибки равен 1052, назначьте его следующим образом:

Err.Number = vbObjectError + 1052

Внимание

Системные ошибки во время вызовов библиотек динамического канала Windows (DLL) не вызывают исключений и не могут быть захвачены с помощью перехвата ошибок Visual Basic. При вызове функций DLL необходимо проверить каждое возвращаемое значение успешного выполнения или сбоя (в соответствии со спецификациями API), а в случае сбоя проверьте значение в свойстве Err объекта LastDLLError .

Пример

В этом примере сначала используется On Error GoTo инструкция, чтобы указать расположение подпрограммы обработки ошибок в процедуре. В этом примере попытка деления на нуль приводит к возникновению ошибки 6. Ошибка обрабатывается в подпрограмме обработки ошибок, а затем элемент управления возвращается в инструкцию, которая вызвала ошибку. Оператор On Error GoTo 0 отключает перехват ошибок. On Error Resume Next Затем инструкция используется для отложения ошибок в ловушке, чтобы контекст для ошибки, созданной следующей инструкцией, мог быть известен определенным образом. Обратите внимание, что используется для Err.Clear очистки Err свойств объекта после обработки ошибки.

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

Требования

Пространство имен: Microsoft.VisualBasic

Сборка: библиотека среды выполнения Visual Basic (в Microsoft.VisualBasic.dll)

См. также