В этой статье мы рассмотри обработку ошибок в языке 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 '------------------------------------------------------------------------------ Option Explicit 'включаем обработку ошибок On Error Resume Next 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=0 msg="" msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массива Do result=15/MyArr(icount) If Err.Number <> 0 Then msgErr=msgErr & "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr="" end if icount = icount+1 msg=msg & Result & vbCrLf & vbCrLf Loop While (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 '------------------------------------------------------------------------------ Option Explicit 'включаем обработку ошибок On Error Resume Next 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=0 msg="" msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массива Do result=15/MyArr(icount) If Err.Number <> 0 Then msgErr=msgErr + "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr="" ' Отменяем обработку ошибок!!! On Error Goto 0 end if icount = icount+1 msg=msg & result & vbCrLf & vbCrLf Loop While (icount < 8) MsgBox msg |
Тут мы дополнительно использовали конструкцию On Error Goto 0, которая отключает обработку ошибок. Это приведёт к тому, что никакие вычисления не будут произведены, и при запуске сценария автоматически произойдёт ошибка времени выполнения.
Пример 3
'------------------------------------------------------------------------------ ' on error resume next vbscript ' Правильный подход обработки ошибок ' on_error_3.vbs '------------------------------------------------------------------------------ Option Explicit 'включаем обработку ошибок On Error Resume Next 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=0 msg="" msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массива Do 'Очищаем информацию об ошибке Err.Clear result=15/MyArr(icount) If Err.Number <> 0 Then msgErr=msgErr + "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr="" end if icount = icount+1 msg=msg & result & vbCrLf & vbCrLf Loop While (icount < 8) MsgBox msg |
В этом примере мы сделали все правильно, так как вначале цикла прописали Err.Clear, который очищает информацию о предыдущих ошибках.
Ну и наконец четвертый пример, тут мы генерируем собственное описание ошибки.
Пример 4
'------------------------------------------------------------------------------ ' on error resume next vbscript ' генерация собственной ошибки ' on_error_4.vbs '------------------------------------------------------------------------------ Option Explicit 'включаем обработку ошибок On Error Resume Next 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=0 msg="" msgErr = "Ошибка!!!" & vbCrLf 'циклично делим число 15 на каждый элемент массива Do 'Очищаем информацию об ошибке Err.Clear result=15/MyArr(icount) If Err.Number <> 0 Then Err.Raise 100, "текущий сценарий", "пробуем делить на ноль" msgErr=msgErr + "Код ошибки: " & Err.Number & vbCrLf &_ "Описание: " & Err.Description & vbCrLf &_ "Приложение: " & Err.Source & vbCrLf result = msgErr msgErr="" end if icount = icount+1 msg=msg & result & vbCrLf & vbCrLf Loop While (icount < 8) MsgBox msg |
Давайте подытожим сказанной в данной статье…. Должен сказать, что материал получился довольно сухим на предмет обзора, это и не удивительно — большую часть занимают примеры программного кода. В целом, мы рассмотрели внутренний объект Err, который содержит методы и свойства для обработки исключительных ситуаций в сценариях на языке VBSCRIPT.
разметка кода примеров слетела