理解VBScript中的错误

时间:2014-06-19 23:34:28

标签: vbscript

我正在尝试修改vbscript并按照指示将其转换为Powershell。我的函数SearchAD上有一段代码块,出现On Error。

on error resume next
Set objRS = command.execute

SearchAD = objRS.RecordCount
on error goto 0

我的问题是代码的哪一部分可以触发RESUME Next和GOTO 0的部分内容。

3 个答案:

答案 0 :(得分:4)

在VBScript中有两种错误状态(其他VB中有三种)。

On Error Goto 0

vbscript处理错误。您的程序因错误而崩溃。

On Error Resume Next

VBScript设置错误对象,但不会引发错误。您需要在可能引发错误的每一行之后放置

If err.number <> 0 then 
    FreakoutAndFixTheError
    err.clear
    wscript.quit 'if you can't fix
End If

在VB6和VBA中也有

On Error Goto LineNumber (or a label)

答案 1 :(得分:0)

简单地说,On Error Resume Next禁用错误报告。并On Error GoTo 0恢复它。当程序员期望发生错误但不希望该错误无法处理并停止其脚本时,通常会使用它。例如:

' This statement will cause VBScript to throw an error and halt.
i = 1 / 0

' Instead, let us handle the error and decide if its important...
On Error Resume Next    ' Turn off error reporting
i = 1 / 0

' Now, we can test the Err object to see if any errors were thrown...
If Err.Number = 0 Then
    ' Success. No error occurred.
ElseIf Err.Number = 11 Then
    ' Error #11 is 'Division by zero'. Do we want to allow it?
End If

' We're through the risky section. Restore error reporting.
On Error GoTo 0

现在是一个肥皂盒咆哮的时候了。不要使用它。几乎总有比使用On Error Resume Next更好的方法。断言变量值。在尝试访问数组元素之前检查数组边界。做QA测试。验证用户输入。成为一名优秀的程序员,涵盖所有角度。不要只是闭上眼睛看任何错误,并假设一切都会起作用。它经常被VB初学者滥用,不幸的是,甚至是一些专家! (结束咆哮)

答案 2 :(得分:-2)

这是VB6(比vbscript&#39; s更深入)的帮助。 VBA是VB6的核心语言。

Visual Basic for Applications参考

错误陈述

启用错误处理例程并指定例程中例程的位置;也可用于禁用错误处理例程。

语法

On Error GoTo line 

On Error Resume Next

On Error GoTo 0

On Error语句语法可以具有以下任何一种形式:

声明说明

On Error GoTo line
启用从所需行参数中指定的行开始的错误处理例程。 line参数是任何行标签或行号。如果发生运行时错误,控制分支到行,使错误处理程序处于活动状态。指定的行必须与On Error语句在同一过程中;否则,发生编译时错误。

On Error Resume Next 指定当发生运行时错误时,控制转到紧接执行继续执行错误的语句之后的语句。访问对象时,请使用此表单而不是On Error GoTo。

On Error GoTo 0 在当前过程中禁用任何已启用的错误处理程序。

说明

如果您不使用On Error语句,则发生的任何运行时错误都是致命的;也就是说,会显示一条错误消息并停止执行。

启用&#34;启用&#34;错误处理程序是由On Error语句打开的错误处理程序; &#34;活跃&#34;错误处理程序是处理错误的已启用处理程序。如果在错误处理程序处于活动状态时发生错误(在错误发生与Resume,Exit Sub,Exit Function或Exit Property语句之间),则当前过程的错误处理程序无法处理错误。控制返回到调用过程。如果调用过程具有启用的错误处理程序,则会激活它以处理错误。如果调用过程的错误处理程序也处于活动状态,则控制将返回先前的调用过程,直到找到启用但非活动的错误处理程序。如果找不到非活动的,启用的错误处理程序,则错误在实际发生时是致命的。每次错误处理程序将控制权传递回调用过程时,该过程将成为当前过程。一旦在任何过程中由错误处理程序处理错误,执行将在Resume语句指定的点处在当前过程中恢复。

注意错误处理例程不是Sub过程或Function过程。它是由行标签或行号标记的代码段。

错误处理例程依赖于Err对象的Number属性中的值来确定错误的原因。错误处理例程应该在发生任何其他错误之前或者在调用可能导致错误的过程之前测试或保存Err对象中的相关属性值。 Err对象中的属性值仅反映最近的错误。与Err.Number关联的错误消息包含在Err.Description中。

On Error Resume Next导致执行继续执行导致运行时错误的语句之后的语句,或者紧跟在包含On Error Resume Next语句的过程的最近调用之后的语句。尽管存在运行时错误,但此语句允许继续执行。您可以将错误处理例程放在发生错误的位置,而不是将控制转移到过程中的其他位置。一个On Error Resume Next语句在调用另一个过程时变为非活动状态,因此如果您希望在该例程中进行内联错误处理,则应在每个被调用例程中执行On Error Resume Next语句。

注意On Error Resume Next结构在处理访问其他对象期间生成的错误时可能优于On Error GoTo。在每次与对象交互之后检查Err消除了代码访问哪个对象的模糊性。您可以确定哪个对象将错误代码放在Err.Number中,以及最初生成错误的对象(Err.Source中指定的对象)。

On Error GoTo 0禁用当前过程中的错误处理。它没有指定第0行作为错误处理代码的开头,即使该过程包含一行编号为0.如果没有On Error GoTo 0语句,则在退出过程时会自动禁用错误处理程序。 / p>

为防止错误处理代码在未发生错误时运行,请在错误处理例程之前立即放置Exit Sub,Exit Function或Exit Property语句,如下面的片段所示:

Sub InitializeMatrix(Var1, Var2, Var3, Var4)
   On Error GoTo ErrorHandler
   . . .
   Exit Sub
ErrorHandler:
   . . .
   Resume Next
End Sub

此处,错误处理代码在Exit Sub语句之后,并在End Sub语句之前,以将其与过程流分开。错误处理代码可以放在过程中的任何位置。

当对象作为可执行文件运行时,对象中的未捕获错误将返回到控制应用程序。在开发环境中,如果设置了正确的选项,则仅将未捕获的错误返回到控制应用程序。有关在调试期间应设置哪些选项,如何设置它们以及主机是否可以创建类的说明,请参阅主机应用程序的文档。

如果您创建一个访问其他对象的对象,您应该尝试处理从它们传回的错误未处理。如果无法处理此类错误,请将Err.Number中的错误代码映射到您自己的错误之一,然后将它们传递回对象的调用方。您应该通过将错误代码添加到vbObjectError常量来指定错误。例如,如果您的错误代码是1052,请按如下方式进行分配:

Err.Number = vbObjectError + 1052

注意调用Windows动态链接库(DLL)期间的系统错误不会引发异常,也不会使用Visual Basic错误捕获捕获。调用DLL函数时,应检查每个返回值的成功或失败(根据API规范),如果发生故障,请检查Err对象的LastDLLError属性中的值。


向MSDN发送反馈。请点击此处查看MSDN Online资源。