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

Meh*_*dad 35 vbscript try-catch

我正在尝试以下代码:

Try ' DOESN'T WORK
    Throw 2 ' How do I throw an exception?
Catch ex
    'What do I do here?
End Try
Run Code Online (Sandbox Code Playgroud)

但是我Statement expected在catch子句中遇到错误.

有谁知道如何使用try/catch在VBScript中捕获/抛出异常?(我不是在寻找解决方案On Error Do X.)

Mar*_*bau 70

处理错误

我们在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."
Run Code Online (Sandbox Code Playgroud)

如上所述,我们只是打印出错误.如果错误是致命的脚本,你可以更换第二Err.clearWScript.Quit(Err.Number).

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

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

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


提高错误

如果你想检查某种状态,然后提出一个错误,由调用你的函数的代码处理,你会使用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
Run Code Online (Sandbox Code Playgroud)

然后,您可以处理上面讨论的引发的错误.


更改日志

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

    Tmd*_*ean 20

    VBScript没有Try/Catch.(VBScript语言参考.如果有Try,它将列在Statements部分.)

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

    • 我想它也必须支持Trraoysfoaiuerlkj,因为如果你改变了尝试,它也没有错误.;)我猜它认为Try可能是脚本后面出现的Sub的名称. (7认同)
    • @Tmdean我实际上用Google搜索了Trraoysfoaiuerlkj.谢谢天才. (4认同)
    • 这是正确的,VBScript将其视为没有参数的Sub,因此如果您不使用Option Explicit或使用On Error Resume Next,则不会出错.这就是为什么你应该定期使用Option Explicit和On Error Resume Next sparcely的原因.因为如果你输错了,你可以通过提及未声明的语句或无法识别的子/函数轻松地检测它. (3认同)