我尝试以下代码:
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
的解决方案。)
答案 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
指令仅影响当前运行范围(当前Sub
或Function
),不会影响调用或调用范围。
如果要检查某种状态,然后引发错误以由调用函数的代码处理,则可以使用Err.Raise
。 Err.Raise
最多需要五个参数Number
,Source
,Description
,HelpFile
和HelpContext
。使用帮助文件和上下文超出了本文的范围。 Number
是您选择的错误号,Source
是引发错误的应用程序/类/对象/属性的名称,Description
是发生错误的简短描述
If MyValue <> 42 Then
Err.Raise(42, "HitchhikerMatrix", "There is no spoon!")
End If
然后您可以处理上面提到的引发的错误。
更改日志
Err.Clear
以清除可能已被忽略的任何先前错误。
子> On Error Resume Next
和Err.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中的解决方法尝试捕获存在:
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
。这就是如何在不吞下任何其他错误的情况下“吞下”错误。将代码划分为小的独立函数还可以提高可读性,重构和优化。可以更轻松地添加一些新功能。