Активизирует подпрограмму обработки ошибок и указывает положение подпрограммы в процедуре; используется также для отключения подпрограммы обработки ошибок.
- On Error GoTo строка — Активизирует подпрограмму обработки ошибок, начало которой определяется обязательным аргументом строка, значением которого может быть любая метка строки или номер строки. Если возвращается ошибка выполнения, управление передается на указанную строку и запускается обработчик ошибок. Аргумент строка должен определять строку в той же процедуре, в которой находится инструкция On Error; в противном случае возникает ошибка компиляции.
- On Error Resume Next — Указывает, что возникновение ошибки выполнения приводит к передаче управления на инструкцию, непосредственно следующую за инструкцией, при выполнении которой возникла ошибка. Рекомендуется при доступе к объектам использовать эту форму инструкции, а не On Error GoTo.
- On Error GoTo 0 — Отключает любой активизированный обработчик ошибок в текущей процедуре.
Замечания
Если не выполнена инструкция On Error, то любая ошибка выполнения является фатальной; это означает, что выводится сообщение об ошибке и выполнение программы прекращается.
«Включенным» обработчиком ошибок называют подпрограмму, которая указана в инструкции On Error; «активным» обработчиком ошибок является включенный обработчик ошибок, который обрабатывает текущую ошибку. Если ошибка возникает в самом обработчике ошибок (в промежутке между возникновением ошибки и выполнением инструкции Resume, Exit Sub, Exit Function или Exit Property), то обработчик ошибок, определенный в текущей процедуре, не может обработать ошибку. Управление в этом случае возвращается в вызывающую процедуру; если в вызывающей процедуре включен обработчик ошибок, то обработка ошибки передается ему. Если этот обработчик ошибок является в данный момент активным, т.е. уже обрабатывает ошибку, то управление снова передается назад в вызывающую процедуру и т.д. до тех пор, пока не будет найден включенный, но не активный обработчик ошибок. Если включенный, но неактивный обработчик ошибок найден не будет, ошибка становится фатальной в том месте программы, в котором она впервые возникла. При каждой передаче управления обработчиком ошибок в вызывающую процедуру эта процедура становится текущей. После завершения обработки ошибки обработчиком в любой процедуре возобновляется выполнение текущей процедуры с той ее части, которая указана в инструкции Resume.
Подпрограмма обработки ошибок не может быть процедурой Sub или Function. Эта подпрограмма должна быть частью программы, которая отмечается с помощью метки строки или номера строки.
Для определения причины ошибки в подпрограммах обработки ошибок используют значение свойства Number объекта Err. Необходимо обеспечить в подпрограммах обработки ошибок проверку или сохранение существенных значений свойств объекта Err перед тем, как может возникнуть новая ошибка или перед вызовом процедуры, в которой может возникнуть новая ошибка. Значения свойств объекта Err описывают последнюю ошибку. Текст сообщения об ошибке, соответствующего коду ошибки Err.Number содержится в свойстве Err.Description.
Конструкция 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 отключает обработку ошибок в текущей процедуре. Эта конструкция не задает переход на строку 0 для обработки ошибок, даже если в процедуре имеется строка с номером 0. Если инструкция On Error GoTo 0 не выполнялась, то обработчик автоматически отключается при выходе из процедуры.
Для того, чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, следует помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property сразу после подпрограммы обработки ошибки, как в следующем примере:
Sub InitializeMatrix(Var1, Var2, Var3, Var4) On Error GoTo ОбработкаОшибок . . . Exit Sub ОбработкаОшибок: . . . Resume Next End Sub
В этом примере программа обработки ошибок помещена между инструкциями Exit Sub и End Sub, что позволяет отделить ее от части программы, соответствующей нормальному выполнению процедуры. Программу обработки ошибок можно разместить в любом месте процедуры.
Ошибки, которые не были перехвачены, возвращаются в управляющее приложение, если объект был запущен как исполняемый файл. В среде разработчика такие ошибки возвращаются в управляющее приложение только при указании соответствующих параметров. За описанием необходимых значений этих параметров и способов их задания следует обращаться к документации главного приложения. Там же следует проверить, позволяет ли главное приложение создавать классы.
Err.Number = vbObjectError + 1052
Системные ошибки при вызовах библиотек динамической компоновки (DLL) не приводят к возникновению исключений и не перехватываются средствами Visual Basic. При вызове функций из библиотек DLL необходимо проверять, успешно ли возвращается каждое значение (согласно спецификациям API), и в случае неудачи проверять значение свойства LastDLLError объекта Err.
Пример
В начале этой программы инструкция On Error GoTo определяет положение подпрограммы обработки ошибок в процедуре. В данном примере попытка удалить открытый файл приводит к возникновению ошибки с кодом 55. Ошибка обрабатывается в подпрограмме, после чего управление возвращается инструкции, которая привела к возникновению ошибки. Инструкция On Error GoTo 0 отключает перехват ошибок. После этого инструкция On Error Resume Next задает отложенный перехват ошибок, что позволяет точно определить, в каком контексте возникла ошибка, генерируемая в следующей инструкции. Следует отметить, что после обработки ошибки вызывается метод Err.Clear для сброса значений свойств объекта Err.
Sub OnErrorStatementDemo() On Error GoTo ErrorHandler ' Включаем программу обработки ' ошибок. Open "TESTFILE" For Output As #1 ' Открываем файл. Kill "TESTFILE" ' Попытка удалить открытый ' файл. On Error Goto 0 ' Отключаем перехват ошибок. On Error Resume Next ' Откладываем перехват ошибок. ObjectRef = GetObject("MyWord.Basic") ' Запускаем несуществующий ' объект, а затем проверяем ' ошибку механизма управления ' программируемыми объектами. If Err.Number = 440 Or Err.Number = 432 Then ' Выводим сообщение для пользователя и очищаем объект Err. Msg = "Ошибка при попытке открыть программируемый объект!" MsgBox Msg, , "Проверка отложенной ошибки" Err.Clear ' Очищаем поля объекта Err. End If Exit Sub ' Выходим из процедуры, чтобы ' не попасть в обработчик. ErrorHandler: ' Обработчик ошибок. Select Case Err.Number ' Определяем код ошибки. Case 55 ' "Ошибка "Файл уже открыт". Close #1 ' Закрываем открытый файл. Case Else ' Здесь размещаются инструкции для обработки других ошибок... End Select Resume ' Возобновляем выполнение ' со строки, вызвавшей ошибку. End Sub
Forum Rules |
|
На чтение 7 мин Просмотров 339 Опубликовано 16.12.2014
В этой статье мы рассмотри обработку ошибок в языке VBScript, а именно объектErr, конструкцию On Error Resume Next и On Error Goto 0. Конструкция VBScript On Error Resume Next включает обработку ошибок, а On Error Goto 0 отменяет их обработку.
Объект Err не нуждается в предварительном объявлении, и доступен всегда, давайте рассмотри его методы и свойства:
- Description — данное свойство содержит описание ошибки.
- Number — содержит целое число – номер ошибки. Если значение свойства Number ровно нулю – значит, ошибка отсутствует.
- Source — свойство содержит название приложения, в котором возникла ошибка.
Методы
Clear – полная очистка информации об ошибке. Стоит обратить внимание, что информация об ошибке автоматически очищается при выполнении операторов On Error Resume Next, Exit Sub и Exit Function.
Raise(number, [source, description]) – данный метод позволяет генерировать собственную ошибку времени выполнения. Видим, что тут можно задать параметры, аналогичные по своей принадлежности свойствам самого объекта Err. Видим, что тут является обязательным только первый параметр.
Хорошо, теперь давайте рассмотри четыре примера на языке vbscript.
Пример 1
'------------------------------------------------------------------------------' vbscript on error resume next' произойдет вычисление только для первых 3 значений' on_error_1.vbs'------------------------------------------------------------------------------ OptionExplicit 'включаем обработку ошибокOnErrorResumeNext dim MyArr(8), icount, Result, msgErr, msg ' заполняем массив MyArr(0) = 5 MyArr(1) = -3 MyArr(2) = 15 MyArr(3) = 0 MyArr(4) = 2 MyArr(5) = 6 MyArr(6) = 0 MyArr(7) = -1 icount=0msg=""msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массиваDo result=15/MyArr(icount) If Err.Number <> 0 ThenmsgErr=msgErr & "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr=""endif icount = icount+1 msg=msg & Result & vbCrLf & vbCrLfLoopWhile (icount <8) MsgBox msg
В данном примере мы создали массив из 8 элементов, каждый из которых является числом, два элемента – являются нулями. В цикле do…loop (работа данного цикла рассмотрена в статье Урок 7 по VBScript: Циклы do…loop и while…wend) идет деление числа 15 на каждый элемент массива (Урок 9 по VBScript: Массивы). Так как мы не включили в данном примере очистку информации об ошибке, то произойдёт деление только первых трёх значений, а всё остальное будет принято за ошибку.
Пример 2
'------------------------------------------------------------------------------' vbscript on error resume next' Вычисления не произойдут' on_error_2.vbs'------------------------------------------------------------------------------ OptionExplicit 'включаем обработку ошибокOnErrorResumeNext dim MyArr(8), icount, Result, msgErr, msg ' заполняем массив MyArr(0) = 5 MyArr(1) = -3 MyArr(2) = 15 MyArr(3) = 0 MyArr(4) = 2 MyArr(5) = 6 MyArr(6) = 0 MyArr(7) = -1 icount=0msg=""msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массиваDo result=15/MyArr(icount) If Err.Number <> 0 ThenmsgErr=msgErr + "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr=""' Отменяем обработку ошибок!!!OnErrorGoto 0 endif icount = icount+1 msg=msg & result & vbCrLf & vbCrLfLoopWhile (icount <8) MsgBox msg
Тут мы дополнительно использовали конструкцию On Error Goto 0, которая отключает обработку ошибок. Это приведёт к тому, что никакие вычисления не будут произведены, и при запуске сценария автоматически произойдёт ошибка времени выполнения.
Скачать архив с примерами
Пример 3
'------------------------------------------------------------------------------' on error resume next vbscript' Правильный подход обработки ошибок' on_error_3.vbs'------------------------------------------------------------------------------ OptionExplicit 'включаем обработку ошибокOnErrorResumeNext dim MyArr(8), icount, Result, msgErr, msg ' заполняем массив MyArr(0) = 5 MyArr(1) = -3 MyArr(2) = 15 MyArr(3) = 0 MyArr(4) = 2 MyArr(5) = 6 MyArr(6) = 0 MyArr(7) = -1 icount=0msg=""msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массиваDo'Очищаем информацию об ошибке Err.Clear result=15/MyArr(icount) If Err.Number <> 0 ThenmsgErr=msgErr + "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr=""endif icount = icount+1 msg=msg & result & vbCrLf & vbCrLfLoopWhile (icount <8) MsgBox msg
В этом примере мы сделали все правильно, так как вначале цикла прописали Err.Clear, который очищает информацию о предыдущих ошибках.
Ну и наконец четвертый пример, тут мы генерируем собственное описание ошибки.
Пример 4
'------------------------------------------------------------------------------' on error resume next vbscript' генерация собственной ошибки' on_error_4.vbs'------------------------------------------------------------------------------ OptionExplicit 'включаем обработку ошибокOnErrorResumeNext dim MyArr(8), icount, Result, msgErr, msg ' заполняем массив MyArr(0) = 5 MyArr(1) = -3 MyArr(2) = 15 MyArr(3) = 0 MyArr(4) = 2 MyArr(5) = 6 MyArr(6) = 0 MyArr(7) = -1 icount=0msg=""msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массиваDo'Очищаем информацию об ошибке Err.Clear result=15/MyArr(icount) If Err.Number <> 0 ThenErr.Raise 100, "текущий сценарий", "пробуем делить на ноль" msgErr=msgErr + "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr=""endif icount = icount+1 msg=msg & result & vbCrLf & vbCrLfLoopWhile (icount <8) MsgBox msg
Давайте подытожим сказанной в данной статье…. Должен сказать, что материал получился довольно сухим на предмет обзора, это и не удивительно — большую часть занимают примеры программного кода. В целом, мы рассмотрели внутренний объект Err, который содержит методы и свойства для обработки исключительных ситуаций в сценариях на языке VBSCRIPT.
Обработка ошибок времени выполнения
При обнаружении ошибки времени выполнения
Visual Basic выводит сообщение об ошибке и
приостанавливает выполнение программы.
Однако Visual Basic предоставляет пользователю
средства, с помощью которых он может
поручить программе выполнить перехват
ошибки и определить дальнейшие действия.
Обработка ошибок — это задание реакции
на ошибки, которые возникают во время
выполнения программы.
Обработка ошибок
производится в три этапа:
-
Подготовка
перехвата.
Выполняется с помощью оператора On
Error. Оператор
On Error
активизирует режим обработки ошибок.
Это означает, что при возникновении
ошибки выполнения программа не
прерывается и стандартное сообщение
об ошибке не выводится. Оператор On
Error осуществляет
передачу управления на подпрограмму
обработки ошибок, которая может выдавать
сообщение и продолжать работу программы.
Возможны три варианта синтаксиса
оператора:
On Error GoTo метка |
передача |
On Error Resume Next — |
ошибка |
On Error GoTo 0 — |
отключает |
Для
перехвата всех возможных ошибок оператор
On Error должен
находится в начале процедуры.
-
Проверка
и устранение ошибки. Это
этап обработки ошибки, на котором
возникшая ошибка анализируется, и
выполняются соответствующие действия.
Установить тип ошибки можно с помощью
объекта Err.
Свойства объекта Err
позволяют
получить следующую информацию о
последней ошибке выполнения: свойство
Number — номер
возникшей ошибки;
свойство
Source — имя
проекта, в котором возникла ошибка;
свойство
Description —
строка с описанием ошибки;
свойство
HelpFile — полное
имя файла справки.
После
того как обнаруженная ошибка обработана,
в процедуре нужно предусмотреть очистку
свойств объекта Err.
Очищает значения всех свойств объекта
Err метод
Clear.
Все
ошибки выполнения можно разделить на
две группы: ожидаемые, обработка которых
может быть предусмотрена заранее при
разработке программы и неожиданные.
Если ожидаемые ошибки известны заранее,
то целесообразно создать единый для
всех процедур модуля обработчик ошибок
в виде процедуры. Параметром такой
процедуры должен быть код ошибки.
-
Продолжение
выполнения программы.
Выполняется с помощью оператора Resume.
Оператор Resume
передает управление из обработчика
ошибок в программу. Возможны следующие
варианты синтаксиса оператора:
Resume [0] — |
повторное |
Resume Next — |
выполнение |
Resume метка — |
выполнение |
Средства обнаружения логических ошибок
В
Visual Basic для обнаружения логических
ошибок имеются следующие средства
отладки программ:
-
точка
останова.
Точка останова — это специальная
инструкция в процедуре, на которой
работа процедуры приостанавливается; -
трассировка
процедур.
Трассировка — это пошаговое (пооператорное)
выполнение процедуры, позволяющее
контролировать правильность выполнения
алгоритма процедуры;
-
отслеживание
в диалоговых окна Locals,
Quick
Watch
и Watches
значений
переменных, выражений, свойств объектов,
возможность изменения этих значений
в окне Watches.
В Visual Basic имеется
три режима работы с программой:
-
режим
работы с текстом программы в редакторе
кода; -
режим выполнения,
в котором текст программы не доступен
для изменения, его можно только
просматривать в окне редактора кода; -
режим
прерывания (режим отладки), когда
осуществляется приостановка работы
программы. Режим позволяет просматривать
значения переменных, продолжать или
прекращать работу программы, вносить
изменения в текст программы.
Кнопки
команд, реализующих средства отладки
расположены на панели инструментов
Debug(отладка).
Команды отладки доступны также из меню
Debug.
Кроме этого выполнить эти команды можно
из контекстного меню вызванного в окне
редактора кода.
Панель
инструментов Debug:
|
Start/Continue (Продолжить) |
Запускает |
|
Break (Прервать) |
Вызывает прерывание |
|
End (Сброс) |
Завершает выполнение программы |
|
Togge Breakpoint (Точка |
Устанавливает |
|
Step Into (Шаг |
Осуществляет |
|
Step Over (Шаг |
Осуществляет |
|
Step Out (Шаг |
Выполняет |
|
Locals Window (Окно |
Открывает |
|
Immediate Window (Окно |
Открывает |
|
Watch Window (Окно |
Открывает |
|
Quick Watch (Быстрый |
Открывает |
|
Call Stack (Стек |
В |
Точка
останова. Точки
останова устанавливаются в том случае
когда:
-
требуется остановить
выполнения программы в нужном месте и
проанализировать значение переменных; -
нужно
выполнить трассировку фрагмента
процедуры, для проверки работы алгоритма
(устанавливается две точки в начало и
конец фрагмента процедуры) и т.д.
Установить
точку останова можно командой или
указателем мыши, щелкнув по полосе
индикатора. Полоса индикатора расположена
слева от текста процедуры в окне редактора
кода и выделена серым цветом. Для
отображения полосы индикатора следует
установить опцию Margin
Indicator Bar на
вкладке Editor
Format в окне
команды
ToolsOptions.
Установленные в
среде разработки точки останова не
сохраняются вместе с программой и не
включаются в exe-файл при его создании.
Удаление
точки останова осуществляется повторным
выполнением команды
Togge Breakpoint. Несколько
точек останова модно удалить одновременно
командой Clear
All Breakpoints меню
Debug.
Можно
остановить выполнение программы в
нужном месте, не используя точку останова.
Для этого следует установить курсор в
ту строку, до которой должна выполняться
программа, и выбрать команду Run
To Cursor меню
Debug.
Трассировка
процедур.
Выполняется в режиме отладки программы
и позволяет наблюдать за результатами
выполнения каждой строки программы.
Является важным средством поиска ошибок
и отладки программ. Трассировку можно
выполнить с помощью команд
Step Into, Step
Over
и Step Out.
Друг от друга команды отличаются
правилами работы с вызываемыми
процедурами.
Если
трассировка программы выполняется
командой Step
Into (шаг с
заходом), то при выполнении оператора
вызова процедуры (функции) осуществляется
переход в процедуру (функцию) и последующее
выполнение команды Step
Into приводит
к трассировке процедуры.
В
отличие от команды Step
Into, команда
Step Over
(шаг с обходом)
выполняет вызов процедуры (функции)
как единичный оператор, те есть без
захода в процедуру (функцию).
В
том случае, когда требуется пошаговое
выполнение части процедуры до заданного
оператора, следует воспользоваться
двумя операторами Step
Into и Step
Out
(шаг с
выходом).
До заданного оператора трассировка
должна выполняться командой Step
Into. Когда
маркер помечает этот оператор, следует
выполнить командуй Step
Out.
Команда Step
Out
выполнить оставшуюся часть процедуры
и возвратиться в точку вызова.
Просмотр
значений.
Выполняется в режиме отладки и позволяет
контролировать значения переменных и
выражений в процессе выполнения
программы. Visual Basic предоставляет для
этого следующие средства:
-
Окно
Data Tips.
В окне Data
Tips отображается
значение той переменной, на которую
установлен указатель мыши. Установить
средство Auto
Data Tips можно
в окне команды ToolsOptions
на вкладке Editor. -
Окно
Quick
Watch.
В окне Quick
Watch
можно также просмотреть значение одной
выбранной переменной (курсор должен
находится на имени переменной). Из окна
Quick
Watch
можно выполнить добавление переменной
в окно просмотра Watches
(кнопка Add).
Окно Quick
Watch
открывается командой Quick
Watch
меню Debug
или кнопкой(Quick
Watch)
на панели Debug. -
Окно
Watches.
В окне Wanches
отображаются контролируемые выражения
и их значения. Окно Wanches
открывается кнопкойWatch
Window
панели Debug
или командой Watch
Window
меню View.
Добавить
выражение в окно можно:
-
из
окна команды Quick
Watch
кнопкой Add; -
командой
Add
Watch
меню Debug; -
перетаскиванием
выражения из окна редактора кода в окно
Wanches. -
Выражение
в окне Wanches
можно не только просматривать, но и
редактировать. Можно изменить также и
текущее значение выражения. Для этого
достаточно в окне Wanches
щелкнуть мышью на изменяемом выражении
или значении. -
Окно
Locals.
Это окно отображает все локальные
переменные выполняемой процедуры и их
значения в режиме отладки автоматически.
Окно Locals
открывается кнопкойLocals
Window
меню View.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #