Try-Catch-End试用VBScript似乎不起作用

时间:2011-02-15 02:25:06

标签: vbscript try-catch

尝试以下代码:

Try ' DOESN'T WORK
    Throw 2 ' How do I throw an exception?
Catch ex
    'What do I do here?
End Try

但我在catch子句中收到错误Statement expected

有没有人知道如何使用try / catch 在VBScript 中捕获/抛出异常? (我正在寻找On Error Do X的解决方案。)

4 个答案:

答案 0 :(得分:67)

处理错误

我们在VBScript中可以使用一种“旧样式”的错误处理,它确实使用了On Error Resume Next。首先我们启用它(通常在文件的顶部;但是您可以使用代替下面的第一个Err.Clear以获得它们的组合效果),然后在运行我们的可能错误之前生成代码,清除已经发生的任何错误,运行可能生成错误的代码,然后显式检查错误:

On Error Resume Next
' ...
' Other Code Here (that may have raised an Error)
' ...
Err.Clear      ' Clear any possible Error that previous code raised
Set myObj = CreateObject("SomeKindOfClassThatDoesNotExist")
If Err.Number <> 0 Then
    WScript.Echo "Error: " & Err.Number
    WScript.Echo "Error (Hex): " & Hex(Err.Number)
    WScript.Echo "Source: " &  Err.Source
    WScript.Echo "Description: " &  Err.Description
    Err.Clear             ' Clear the Error
End If
On Error Goto 0           ' Don't resume on Error
WScript.Echo "This text will always print."

上面,我们只是在错误发生时打印出来。如果错误对于脚本是致命的,您可以将第二个Err.clear替换为WScript.Quit(Err.Number)

另请注意On Error Goto 0,当发生错误时,会在下一个语句处关闭恢复执行。

如果要测试Set成功的行为,请继续并注释掉该行,或者创建一个成功的对象,例如vbscript.regexp

On Error指令仅影响当前运行范围(当前SubFunction),不会影响调用或调用范围。


提高错误

如果要检查某种状态,然后引发错误以由调用函数的代码处理,则可以使用Err.RaiseErr.Raise最多需要五个参数NumberSourceDescriptionHelpFileHelpContext。使用帮助文件和上下文超出了本文的范围。 Number是您选择的错误号,Source是引发错误的应用程序/类/对象/属性的名称,Description是发生错误的简短描述

If MyValue <> 42 Then
    Err.Raise(42, "HitchhikerMatrix", "There is no spoon!")
End If

然后您可以处理上面提到的引发的错误。


更改日志

  • 编辑#1: 在可能的错误导致行之前添加Err.Clear以清除可能已被忽略的任何先前错误。
  • 编辑#2: 澄清。
  • 编辑#3: 在代码块中添加了注释。澄清说,预计On Error Resume NextErr.Clear之间会有更多代码。修正了一些语法不那么尴尬。添加了有关Err.Raise的信息。格式化。
  • 答案 1 :(得分:19)

    VBScript没有Try / Catch。 (VBScript language reference。如果有Try,它将列在Statements部分。)

    On Error Resume Next是VBScript中唯一的错误处理。抱歉。如果你想要try / catch,JScript是一个选项。它支持VBScript所具有的所有功能。

    答案 2 :(得分:3)

    通过VBScript中的解决方法尝试捕获存在

    http://web.archive.org/web/20140221063207/http://my.opera.com/Lee_Harvey/blog/2007/04/21/try-catch-finally-in-vbscript-sure

    Class CFunc1
        Private Sub Class_Initialize
            WScript.Echo "Starting"
            Dim i : i = 65535 ^ 65535 
            MsgBox "Should not see this"
        End Sub
    
        Private Sub CatchErr
            If Err.Number = 0 Then Exit Sub
            Select Case Err.Number
                Case 6 WScript.Echo "Overflow handled!" 
                Case Else WScript.Echo "Unhandled error " & Err.Number & " occurred."
            End Select
            Err.Clear
        End Sub
    
        Private Sub Class_Terminate
            CatchErr
            WScript.Echo "Exiting" 
        End Sub 
    End Class
    
    Dim Func1 : Set Func1 = New CFunc1 : Set Func1 = Nothing
    

    答案 3 :(得分:0)

    有时候,特别是当您使用VB时,您可能会错过明显的解决方案。就像我过去2天做的一样。

    生成错误的代码需要移动到单独的函数中。在函数的开头,您编写On Error Resume Next。这就是如何在不吞下任何其他错误的情况下“吞下”错误。将代码划分为小的独立函数还可以提高可读性,重构和优化。可以更轻松地添加一些新功能。