Обзор неструктурной обработки исключений

Обновлен: Ноябрь 2007

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

Иногда из исходной процедуры вызывается другая, и исключение возникает в вызванной процедуре. В таких случаях, если вызванная процедура не обрабатывает исключения, они передаются обратно в вызывающую процедуру, и выполнение ответвляется по аргументу строки.

sf1hwa21.alert_note(ru-ru,VS.90).gifПримечание.

Неструктурная обработка ошибок с использованием оператора On Error, может снизить производительность приложения и привести к сложному в отладке и поддержании коду. Рекомендуется использовать метод структурной обработки исключений. Дополнительные сведения см. в разделе Обзор структурной обработки исключений в Visual Basic.

On Error GoTo Line

Оператор On Error GoTo Line предполагает, что код обработки ошибки начинается со строки, указанной в обязательном аргументе line. Если возникает ошибка во время выполнения, управление ответвляется по метке или номеру строки, указанной в аргументе, активируя обработчик ошибок .. Указанная строка должна быть в той же процедуре, что и оператор On Error GoTo Line; в противном случае Visual Basic выдаст ошибку компилятора. В следующем примере демонстрируется использование обработчика ошибок с меткой строки.

Sub TestSub
   On Error GoTo ErrorHandler
      ' Code that may or may not contain errors.
   Exit Sub

   ErrorHandler:
      ' Code that handles errors.
      Resume
End Sub

В примере имеется обработчик ошибок с именем ErrorHandler. Если какой-либо код в подпрограмме TestSub генерирует ошибку, Visual Basic немедленно выполняет код, следующий за меткой ErrorHandler. В конце блока обработки ошибок оператор Resume передает управление обратно в строку кода, где первоначально возникла ошибка. Остальная часть подпрограммы продолжает выполняться, как если бы ошибки не было.

sf1hwa21.alert_note(ru-ru,VS.90).gifПримечание.

Оператор Exit Sub следует разместить непосредственно перед блоком обработки ошибок. В противном случае Visual Basic выполнит код обработки ошибок в конце подпрограммы, что может вызвать нежелательные или непредвиденные последствия.

On Error Resume Next

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

sf1hwa21.alert_note(ru-ru,VS.90).gifПримечание.

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

Оператор Resume может использоваться и сам по себе, вне оператора On Error. Если оператор Resume используется подобным способом, Visual Basic возвращает управление оператору, который вызвал ошибку. Обычно Resume используется после того, как обработчик ошибок исправит ошибку.

В Visual Basic предусмотрен также оператор Resume Next, который передает управление строке, непосредственно следующей за строкой кода, вызвавшей ошибку. Оператор Resume Next можно применять для случаев, когда ошибка не вызывает остановку работы приложения. Его также можно использовать, если ошибка не изменяет ожидаемый результат выполнения подпрограммы.

Другой вариант оператора Resume — это оператор Resume Line, который похож на On Error GoTo Line. Resume Line передает управление строке, указанной в аргументе line. Resume Line можно использовать только в пределах обработчика ошибок.

sf1hwa21.alert_note(ru-ru,VS.90).gifПримечание.

При отладке кода необходимо отключить оператор On Error Resume Next.

On Error GoTo 0

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

sf1hwa21.alert_note(ru-ru,VS.90).gifПримечание.

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

On Error GoTo -1

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

sf1hwa21.alert_note(ru-ru,VS.90).gifПримечание.

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

Пример неструктурной обработки исключений

В следующем коде обработчик исключений с именем DivideByZero обрабатывает конкретную ошибку — попытку деления на ноль. Если возникают другие ошибки, Visual Basic выдает ошибку во время выполнения и останавливает приложение.

Sub ErrorTest ()
' Declare variables.
   Dim x As Integer, y As Integer, z As Integer
   ' The exception handler is named "DivideByZero".
   On Error GoTo DivideByZero
   ' The main part of the code, which might cause an error.
   x = 2
   y = 0
   z = x \ y

   ' This line disables the exception handler.
   On Error GoTo 0
      Console.WriteLine(x & "/" & y & " = " & z)

   ' Exit the subroutine before the error-handling code.
   ' Failure to do so can create unexpected results.
   Exit Sub

   ' This is the exception handler, which deals with the error.
   DivideByZero:
   ' Include a friendly message to let the user know what is happening.
   Console.WriteLine("You have attempted to divide by zero!")

   ' Provide a solution to the error.
   y = 2

   ' The Resume statement returns to the point at which
   ' the error first occurred, so the application
   ' can continue to run.
   Resume

End Sub

См. также

Задачи

Практическое руководство. Получение сведений из объекта ошибки

Основные понятия

Объект Err при неструктурной обработке исключений

Введение в обработку исключений

Типы ошибок

Выбор между структурной и неструктурной обработкой исключений

Ссылки

Оператор End

Объект Err (Visual Basic)

Оператор Exit (Visual Basic)

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

Инструкция Resume