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

问题描述:

如果发生错误,那么它将分DisplayCustomError,但它不会抛出异常。 预期结果 - 在objHTTP.send(json)之后,它应该抛出异常消息。我曾尝试调用Err.Raise,但它不会抛出任何东西。该代码是用VBScriptVBScript上的错误处理:不抛出错误

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 
+0

您正在使用'On Error Resume Next',它会忽略错误。删除。 – braX

+0

@braX我试图删除On Error Resume NextSub,它抛出的异常,但它不会进入子DisplayCustomError(strMessage),当我第二次运行时,它将分DisplayCustomError(strMessage) –

+0

找到一种方法来测试条件导致你正在得到的任何错误,然后使用if语句来避免发生错误。根据发生的错误,编写代码是一种不好的方法。 – braX

有关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 0Sub 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" 
+0

我已经把错误转到0并且在DisplayCustomError(strMessage)之前调用Err.Raise并且移除了WScript.Quit。现在它正在工作,它正在抛出我想要的错误。谢谢你的帮助。欣赏它。 –

+0

@DevendraVastrakar非常欢迎您!不要忘记通过点击投票按钮下面的勾号来接受这个答案。 :) – BoffinbraiN