VBScript 上的错误处理:不抛出错误

Posted

技术标签:

【中文标题】VBScript 上的错误处理:不抛出错误【英文标题】:Error handling on VBScript: Not throwing error 【发布时间】:2018-01-12 07:02:51 【问题描述】:

如果发生错误,那么它将出现子 DisplayCustomError 但它不会抛出异常。 预期结果 - 在 objHTTP.send (json) 之后它应该抛出异常消息。我试过 Call Err.Raise 但它没有抛出任何东西。代码在VBscript中

 sub run
 On Error Resume Next
    wrapper.getVariable( "Plant_Price_PerKW" ).value = excel.range( "'Cases'!$H$331" )
    wrapper.getVariable( "Net_Present_Value" ).value = excel.range( "'Cases'!$H$782" )
    wrapper.getVariable( "IRR" ).value = excel.range( "'Cases'!$H$783" )
 Dim strMessage
    If Err.Number <> 0 And excel.range( "'Cases'!$H$783" ) = "" Then
     strMessage = "IRR cannot be computed. "
     DisplayCustomError(strMessage)
     WScript.Quit 
    ElseIf Err.Number <> 0 And (excel.range( "'Cases'!$H$783" ) <> "") Then
     strMessage = "Other Outputs cannot be computed."
     DisplayCustomError(strMessage)
     WScript.Quit 
    End If
end sub

Sub DisplayCustomError(strMessage)
If Err.Number <> 0 Then
    Dim errorMessage, objHTTP, URL, json, errorCode, uniqueId, networkInfo, jobId
    errorMessage ="Error while executing EVMLite. Error number " & Err.Number & ". " & Err.Description & " " & Err.Source & strMessage
    errorCode = "ERR-1004"
    uniqueId = wrapper.getVariable("UniqueId").value
    Set networkInfo = CreateObject("WScript.NetWork") 
    jobId = networkInfo.ComputerName
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")    
    URL = "http://10.93.244.224343:9005/vpp/logerror"
    objHTTP.Open "POST", URL, False
    objHTTP.SetRequestHeader "Content-Type", "application/json"
    json = """jobId"": """& jobId &""", ""uniqueId"": """& uniqueId &""", ""errorCode"": """& errorCode &""", ""errorMessage"": """& errorMessage &""""
    'MsgBox json
    objHTTP.send (json)

    On Error Goto 0

    Call Err.Raise(vbObjectError + 10, "EVM Failed to execute", errorMessage)
    'MsgBox objHTTP.ResponseText

 End If
end sub

【问题讨论】:

您正在使用On Error Resume Next,这使它忽略错误。删除它。 @braX 我试图删除 On Error Resume NextSub 并且它抛出异常但它不会进入 sub DisplayCustomError(strMessage) 并且当我第二次运行时它将进入 sub DisplayCustomError(strMessage) 找到一种方法来测试导致您遇到的任何错误的条件,然后使用 if 语句来避免出现错误。根据发生的错误是编写代码的不好方法。 【参考方案1】:

VBScript 实现On Error 的有趣之处在于它不是全局的——它实际上受到范围的限制。因此,如果您在 Sub 或 Function 中应用 On Error Resume Next,然后输入将其关闭的新 Function 或 Sub,则该设置会在 Sub 或 Function 退出时恢复。

在您的情况下,您的Sub run 设置On Error Resume Next 然后它调用Sub DisplayCustomError 设置On Error GoTo 0。这只适用于当你还在里面时DisplayCustomError。当它因Err.Raise 而退出时,您的Sub run 将继续运行,因为在该范围内,它仍设置为On Error Resume Next

在调用DisplayCustomError之前,您需要明确声明On Error GoTo 0 Sub run

这是一个您可以测试的示例 VBS 文件。如果你运行它,不会抛出任何东西,程序将显示消息“完成”。如果您取消注释 Sub1 中的行,则会引发错误“示例 2”。

Sub Sub1()
    On Error Resume Next
    Err.Raise 1, "Example 1"
    'On Error Goto 0
    Sub2
End Sub

Sub Sub2()
    On Error Goto 0
    Err.Raise 2, "Example 2"
End Sub

Sub1
WScript.Echo "Done"

【讨论】:

我在 DisplayCustomError(strMessage) 之前设置了 Error Goto 0 并调用 Err.Raise 并删除了 WScript.Quit。现在它正在工作并且它正在抛出我想要的错误。谢谢你的帮助。欣赏它。 @DevendraVastrakar 不客气!不要忘记通过单击投票按钮下方的勾号将此答案标记为已接受。 :)

以上是关于VBScript 上的错误处理:不抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

PHP 异常处理 总出现致命错误 无法捕获异常

JDBC 超时不抛出 SQLTimeoutException

如何处理不抛出 catch 的 API 请求? (403 错误)

Hystrix 不抛出 HystrixRuntimeException,而是空消息错误

编译器不抛出“找不到模块”错误

Phpunit测试既不输出也不抛出错误