VBScript —使用错误处理


84

我想使用VBScript捕获错误并记录错误(即发生错误“记录某些内容”),然后继续执行脚本的下一行。

例如,

关于错误继续
'执行步骤1
'执行步骤2
'做第3步

当第1步发生错误时,我希望它记录该错误(或使用它执行其他自定义功能),然后在第2步继续执行。这可能吗?以及如何实施?

编辑:我可以做这样的事情吗?

关于错误恢复myErrCatch
'执行步骤1
'执行步骤2
'执行步骤3

myErrCatch:
'日志错误
继续下一个

1
Dylan的响应与VB在错误处理部门获得的响应差不多。这就是为什么我总是可以使用Javascript的原因。
wcm

Answers:


161

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

Visual Basic和应用程序的Visual Basic(VBA)支持“错误时转到[标签]”语法,但是VBScript不支持此语言功能,因此您必须如上所述使用“错误时继续”。


3
你可以在if语句中更改WScript.Echo调用一个函数或子,这可能反过来退出应用程序,记录错误,等等
StormPooper

“包含上次执行的操作的重用”。真的吗?似乎它得到了最后一个错误,这是一个很大的不同。
Damien Golding 2014年

尽管MS的文档建议err.clear在每次检查对象后都需要使用该文件,以防止先前的错误触发下一次检查(例如,technet.microsoft.com/en-us/library/ee692852.aspx),但根据我的经验,此操作err已清除“脚本进行中。在没有进一步测试的情况下,我的猜测是利用对象清除err作为其内部操作的副产品。
user66001 2014年

@ user66001同意,但仍然可以安全地进行显式调用Err.Clear
Lankymart,2015年

12

请注意,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

1
这不是我见过的最清楚的例子,但我明白了。
Lankymart,2015年

7
@Lankymart,您介意链接一个您所看到的更清晰的示例,还是建议使用omegastripes如何改善此示例?
Dominick

3
一秒钟,我的印象是我错过了一种称为“ omegastripes”的新软件工程范式
TheBlastOne '16

4

您可以在facade函数中重新组合steps函数调用:

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

然后,让您的错误处理在调用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

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

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


1

我是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

1
这是ASP经典版本,不是普通的旧VBScript
Jobbo,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.