2016-11-11 1 views
0

Вид новичка с VbScript и попытка реализовать обработку ошибок. Мой метод состоит в том, чтобы передать объект ошибки в подменю HandleErr, но ошибка, по-видимому, очищается оператором «On Error Resume Next» с помощью sub. Использование Windows 7.Объект ошибки VbScript, очищенный от записи об ошибке

On Error Resume Next 
Dim x 
x = 1/0 
msgbox "Original Error: " & err.Number & " - " & err.Description 
if err.number <> 0 then HandleErr err 

Sub HandleErr(objErr) 
    on error resume next '### Without this On Error statement, the script runs fine. 
    msgbox "Error in HandleErr: " & objErr.Number & " - " & objErr.Description '### objErr.Number becomes zero. 
    WScript.Quit objErr.Number 
End Sub 

Я предполагаю, что для этого есть простой ответ. Любая помощь будет принята с благодарностью.

+1

Использование 'On Error Goto 0', чтобы отключить 'On Error Resume Next' и' Err.Clear() ', чтобы очистить текущую ошибку после ее захвата. – Lankymart

ответ

2

Вы хотите остановить ошибки пропуска On Error Resume Next, как только достигнете HandleErr(). Также используйте Err.Clear() для сброса Err объекта.

On Error Resume Next 
Dim x 
x = 1/0 
MsgBox "Original Error: " & Err.Number & " - " & Err.Description 
if Err.Number <> 0 then HandleErr Err 
'Stop skipping lines when errors occur. 
On Error Goto 0 

Sub HandleErr(objErr) 
    MsgBox "Error in HandleErr: " & objErr.Number & " - " & objErr.Description '### objErr.Number becomes zero. 
    'Clear current error now you have trapped it. 
    Err.Clear 
    WScript.Quit objErr.Number 
End Sub 

Лично хотя я бы не пройти Err в вашу функцию, потому что Err глобальная встроенный объект, так что вы все еще можете проверить значения без прохождения его.

On Error Resume Next 
Dim x 
x = 1/0 
MsgBox "Original Error: " & Err.Number & " - " & Err.Description 
Call HandleErr() 
'Stop skipping lines when errors occur. 
On Error Goto 0 

Sub HandleErr() 
    'Do we need to trap an error? 
    If Err.Number <> 0 Then 
     MsgBox "Error in HandleErr: " & Err.Number & " - " & Err.Description '### Err.Number becomes zero. 
     'Clear current error now you have trapped it. 
     Err.Clear 
     WScript.Quit Err.Number 
    End If 
End Sub 
+0

Цените свой ответ. Я вижу, что я не совсем понятна. Msgbox внутри 'HandleErr' предназначен только для отладки. Я хочу, чтобы этот скрипт возвращал код ошибки, поэтому я не обязательно хочу очистить ошибку. Из вашего кода, я полагаю, вы говорите, что в обработчике ошибок нет инструкции 'On Error Resume Next'? – JBStovers

+0

Кроме того, зачем помещать 'On Error Goto 0' в последнюю строку основного корпуса скрипта? – JBStovers

+0

Я полностью вижу вашу точку зрения о том, чтобы не передавать функцию «Err» в функцию. Я проверил, действительно ли «Err» был глобальным, но вначале у моего подпрограмма «On Error Resume Next». Это, похоже, устраняет ошибку. Теперь я вижу, что (без «On Error») вы можете получить доступ к «Err» из под. – JBStovers