2017-02-15 4 views
0

При использовании On Error Resume Next, он пропускает обнаруженную ошибку и переходит к следующей строке. Если мы используем err.Number и err.Description, оно показывает сообщение и номер, связанные с ошибкой. Мой вопрос: что, если он смотрит больше, чем на ошибку ... тогда как это будет отображаться?Если мы сталкиваемся с несколькими ошибками при использовании On Error Resume Next

On Error Resume Next 
    intDivideByZero 
    floatDivideByZero 
If err.Number <> 0 Then 
    msgbox "the error number is : " & err.Number 
    msgbox "the error description is : " & err.Description 
End If 
On error Resume 0 
+3

Он должен быть 'On Error Goto 0 'не' On Error Resume 0 ', что вызовет синтаксическую ошибку, которую вы не ожидаете. – Lankymart

ответ

3

Обработка ошибок VBScript довольно ограничена. Вам нужно будет поместить обработчик ошибок после каждой строки, где может произойти ошибка. Кроме того, объект Err не будет автоматически сброшен после ошибки, поэтому вам нужно сделать это самостоятельно. В противном случае объект будет по-прежнему указывать на ошибку после следующего утверждения, даже если там ничего не произошло.

On Error Resume Next 
intDivideByZero 
If Err Then 
    WScript.Echo "0x" & Hex(Err.Number) & ": " & Err.Description 
    Err.Clear 
End If 
floatDivideByZero 
If Err Then 
    WScript.Echo "0x" & Hex(Err.Number) & ": " & Err.Description 
    Err.Clear 
End If 
On Error Goto 0 

Вы можете упростить это немного обертывания обработчика в процедуре и вызов этой процедуры после каждого оператора:

Sub Trap 
    If Err Then 
     WScript.Echo "0x" & Hex(Err.Number) & ": " & Err.Description 
     Err.Clear 
    End If 
End Sub 

On Error Resume Next 
intDivideByZero : Trap 
floatDivideByZero : Trap 
On Error Goto 0 
+0

Разве это не 'On Error Goto 0'? Кроме того, указание 'On Error Goto 0' вернет' Err.Number' обратно '0' без необходимости в' Err.Clear() '. Я уверен, что если вы запустите это в тот момент, когда он сработает с синтаксической ошибкой. – Lankymart

+1

@ Lankymart Да. Но это утверждение расположено после 'floatDivideByZero'. 'Err' необходимо очистить после каждой ошибки (т. Е. После' intDivideByZero'), иначе вы можете получить ложные срабатывания (например, в ситуации, когда 'intDivideByZero' поднял ошибку, но' floatDivideByZero' не сделал). Вы правы в синтаксисе. Исправлена. –

+0

Да, я это понимаю. Моей точкой было утверждение 'On Error Resume 0' было неправильным для начала. Точка о 'Err.Clear()' была просто хорошим побочным продуктом использования 'On Error Goto 0' сразу после условия, которое вы хотели проверить на ошибку, я не предлагал вам использовать его в примере кода был неправ. Это было больше нацелено на это утверждение в ответ - * «Кроме того, объект« Err »не будет автоматически сброшен после ошибки, поэтому вам нужно сделать это самостоятельно». *. – Lankymart

Смежные вопросы