Оператор On Error (Visual Basic)
Включает подпрограмму обработки ошибок и определяет местоположение этой подпрограммы в процедуре. Может также использоваться для отключения подпрограммы обработки ошибок.
Если оператор On Error отсутствует, любая ошибка во время выполнения является фатальной: программа выводит сообщение об ошибке, и выполнение заканчивается.
По возможности рекомендуется использовать структурированную обработку исключений в коде вместо использования неструктурированной обработки исключений и оператора On Error. Дополнительные сведения см. в разделе Оператор Try... Catch... Finally (Visual Basic).
Примечание
Ключевое слово Error также используется в Оператор Error, который поддерживается для обратной совместимости.
On Error { GoTo [ line | 0 | -1 ] | Resume Next }
Части
Термин |
Определение |
GoTo line |
Включает подпрограмму обработки ошибок, которая начинается со строки, указанной в аргументе line. Аргумент line представляет собой любую метку строки или ее номер. Если во время выполнения возникает ошибка, управление передается на указанную строку, активируя обработчик ошибок. Указанная строка должна находится в той же процедуре, что и оператор On Error, иначе возникнет ошибка во время компиляции. |
GoTo 0 |
Отключает включенный обработчик ошибок в текущей процедуре и сбрасывает его в Nothing. |
GoTo -1 |
Отключает включенные исключения в текущей процедуре и сбрасывает их в Nothing. |
Resume Next |
Указывает, что при возникновении ошибки во время выполнения управление передается оператору, непосредственно следующему за тем, в котором возникла ошибка, и выполнение продолжается с этой точки. Используйте эту форму вместо On Error GoTo при доступе к объектам. |
Заметки
Примечание
По возможности рекомендуется использовать структурированную обработку исключений в коде вместо использования неструктурированной обработки исключений и оператора On Error.Дополнительные сведения см. в разделе Оператор Try... Catch... Finally (Visual Basic).
"Включенный" обработчик ошибок — это обработчик, включенный оператором 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 Resume Next может оказаться предпочтительнее On Error GoTo при обработке ошибок, порожденных во время доступа к другим объектам.Проверка Err после каждого взаимодействия с объектом позволяет избежать неоднозначности при определении объекта, с которым работал код.Это позволяет получить достоверные сведения о том, какой объект поместил Идентификатор ошибки в Err.Number, а также о том, какой объект первоначально создал ошибку (объект, указанный в Err.Source).
On Error GoTo 0
On Error GoTo 0 отключает обработку ошибок в текущей процедуре. Этот оператор не указывает строку 0 в качестве начальной для кода обработки ошибок, даже если процедура содержит строку с номером 0. Если оператор On Error GoTo 0 отсутствует, обработчик событий автоматически отключается при выходе из процедуры.
On Error 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) проверять значение свойства LastDLLError объекта Err.
Пример
В этом примере сначала используется оператор 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 same line
' that caused the error.
End Sub
Требования
Пространство имен: Microsoft.VisualBasic
Сборка: библиотека времени выполнения Visual Basic (в Microsoft.VisualBasic.dll)