Try ' DOESN'T WORK
Throw 2 ' How do I throw an exception?
Catch ex
'What do I do here?
End Try
但是我在catch子句中遇到了错误Statement expected
。
有人知道如何在VBScript中使用try/catch来捕获/抛出异常吗?(我不想使用On Error Do X
的解决方案。)
在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
的信息。格式化。
Err.Clear
是多余的,因为 On Error Resume Next
会为您重置 Err
对象。此外,不要提到 Err.Raise
,它是 VBScript 错误处理工具中非常有用的工具。 - user692942Err.Clear
。我已经添加了关于 Err.Raise
的信息。 - MarkVBScript没有Try/Catch语句。(VBScript 语言参考。如果有Try语句,它会在语句部分列出。)
On Error Resume Next
是VBScript中唯一的错误处理方式。很抱歉。 如果你需要使用try/catch,JScript是一个选项。它在所有支持VBScript的地方都得到支持,并具有相同的功能。
在VBScript中通过变通方式实现Try Catch:
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
有时候,特别是在使用VB时,你可能会错过一些显而易见的解决方案。就像我在过去两天里所做的那样。
生成错误的代码需要移动到一个单独的函数中。在函数的开头写上On Error Resume Next
。这样可以“吞噬”错误,而不会吞噬其他错误。将代码分成小的独立函数也可以提高可读性、重构和添加新功能更容易。
On Error Goto 0
,这样你就不会产生函数调用的开销(也不需要那些不做任何实际工作的小函数)。 - Mark
On Error Resume Next
并不那么糟糕。 - Cody Gray