VBScript - Использование обработки ошибок

Я хочу использовать VBScript для обнаружения ошибок и их регистрации (т.е. при ошибке "log something" ), а затем возобновить следующую строку script.

Например,

On Error Resume Next
'Do Step 1
'Do Step 2
'Do Step 3

Когда на шаге 1 возникает ошибка, я хочу, чтобы она регистрировала эту ошибку (или выполняла с ней другие пользовательские функции), а затем возобновлялась на шаге 2. Возможно ли это? и как я могу его реализовать?

EDIT: могу ли я сделать что-то вроде этого?

On Error Resume myErrCatch
'Do step 1
'Do step 2
'Do step 3

myErrCatch:
'log error
Resume Next

Ответ 1

VBScript не имеет понятия бросать или ловить исключения, но среда выполнения предоставляет глобальный объект Err, который содержит результаты последней выполненной операции. Вы должны явно проверить, не является ли свойство Err.Number отличным от нуля после каждой операции.

On Error Resume Next

DoStep1

If Err.Number <> 0 Then
  WScript.Echo "Error in DoStep1: " & Err.Description
  Err.Clear
End If

DoStep2

If Err.Number <> 0 Then
  WScript.Echo "Error in DoStop2:" & Err.Description
  Err.Clear
End If

'If you no longer want to continue following an error after that block completed,
'call this.
On Error Goto 0

Синтаксис "On Error Goto [label]" поддерживается Visual Basic и Visual Basic для приложений (VBA), но VBScript не поддерживает эту языковую функцию, поэтому вам необходимо использовать On Error Resume Next, как описано выше.

Ответ 2

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

ErrCatch()

Sub ErrCatch()
    Dim Res, CurrentStep

    On Error Resume Next

    Res = UnSafeCode(20, CurrentStep)
    MsgBox "ErrStep " & CurrentStep & vbCrLf & Err.Description

End Sub

Function UnSafeCode(Arg, ErrStep)

    ErrStep = 1
    UnSafeCode = 1 / (Arg - 10)

    ErrStep = 2
    UnSafeCode = 1 / (Arg - 20)

    ErrStep = 3
    UnSafeCode = 1 / (Arg - 30)

    ErrStep = 0
End Function

Ответ 3

Я исключительно новичок в VBScript, так что это не может считаться лучшей практикой, или может быть причина, по которой это не следует делать таким образом, о котором я еще не знаю, но это решение, которое я придумал, чтобы урезать вниз количество кода регистрации ошибок в моем основном блоке кода.

Dim oConn, connStr
Set oConn = Server.CreateObject("ADODB.Connection")
connStr = "Provider=SQLOLEDB;Server=XX;UID=XX;PWD=XX;Databse=XX"

ON ERROR RESUME NEXT

oConn.Open connStr
If err.Number <> 0 Then : showError() : End If


Sub ShowError()

    'You could write the error details to the console...
    errDetail = "<script>" & _
    "console.log('Description: " & err.Description & "');" & _
    "console.log('Error number: " & err.Number & "');" & _
    "console.log('Error source: " & err.Source & "');" & _
    "</script>"

    Response.Write(errDetail)       

    '...you could display the error info directly in the page...
    Response.Write("Error Description: " & err.Description)
    Response.Write("Error Source: " & err.Source)
    Response.Write("Error Number: " & err.Number)

    '...or you could execute additional code when an error is thrown...
    'Insert error handling code here

    err.clear
End Sub

Ответ 4

Вы можете перегруппировать вызовы ваших шагов в функции фасада:

sub facade()
    call step1()
    call step2()
    call step3()
    call step4()
    call step5()
end sub

Затем пусть ваша обработка ошибок будет в верхней функции, которая вызывает фасад:

sub main()
    On error resume next

    call facade()

    If Err.Number <> 0 Then
        ' MsgBox or whatever. You may want to display or log your error there
        msgbox Err.Description
        Err.Clear
    End If

    On Error Goto 0
end sub

Теперь предположим, что step3() вызывает ошибку. Поскольку facade() не обрабатывает ошибки (нет нет On error resume next с facade()), то ошибка будет возвращен в main() и step4() и step5() не будет выполняться.

Ваша обработка ошибок теперь реорганизована в 1 блок кода