Оператор 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
. Обработчик ошибок "активный" — это включенный обработчик, который находится в процессе обработки ошибки.
Если ошибка возникает, когда обработчик ошибок активен (между вхождением ошибки и оператором Resume
Exit 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 Sub
Exit 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)