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
有关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"
我已经把错误转到0并且在DisplayCustomError(strMessage)之前调用Err.Raise并且移除了WScript.Quit。现在它正在工作,它正在抛出我想要的错误。谢谢你的帮助。欣赏它。 –
@DevendraVastrakar非常欢迎您!不要忘记通过点击投票按钮下面的勾号来接受这个答案。 :) – BoffinbraiN
您正在使用'On Error Resume Next',它会忽略错误。删除。 – braX
@braX我试图删除On Error Resume NextSub,它抛出的异常,但它不会进入子DisplayCustomError(strMessage),当我第二次运行时,它将分DisplayCustomError(strMessage) –
找到一种方法来测试条件导致你正在得到的任何错误,然后使用if语句来避免发生错误。根据发生的错误,编写代码是一种不好的方法。 – braX