Вопрос

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

Например,

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

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

Редактировать:Могу ли я сделать что-то подобное?

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

myErrCatch:
'log error
Resume Next
Это было полезно?

Решение

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's completed,
'call this.
On Error Goto 0

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

Другие советы

Обратите внимание , что 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

Я исключительно новичок в 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

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

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 блок кода

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top