VBScript - 使用错误处理

apa*_*dit 81 error-handling vbscript

我想使用VBScript来捕获错误并记录它们(即错误"记录某些内容")然后恢复脚本的下一行.

例如,

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

Dyl*_*tie 152

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
Run Code Online (Sandbox Code Playgroud)

Visual Basic和Visual Basic for Applications(VBA)支持"On Error Goto [label]"语法,但VBScript不支持此语言功能,因此您必须使用On Error Resume Next,如上所述.

  • 您可以在If语句中更改WScript.Echo以调用Function或Sub,这可以依次退出应用程序,记录错误等. (2认同)

ome*_*pes 10

请注意,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
Run Code Online (Sandbox Code Playgroud)

  • @Lankymart你会介意链接一个你当时看到的更清晰的例子,或者建议omegastripes如何改进这个例子? (7认同)
  • 有一秒钟,我得到的印象是我错过了一个名为"omegastripes"的新软件工程范例 (3认同)

Cid*_*Cid 5

您可以在外观函数中重新组合步骤函数调用:

sub facade()
    call step1()
    call step2()
    call step3()
    call step4()
    call step5()
end sub
Run Code Online (Sandbox Code Playgroud)

然后,让您的错误处理在调用 Facade 的上层函数中进行:

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
Run Code Online (Sandbox Code Playgroud)

现在,让我们假设step3()引发错误。由于facade()没有处理错误(有没有 On error resume nextfacade()),错误将返回main(),并step4()step5()将不被执行。

您的错误处理现在在 1 个代码块中重构