Vba VBScript上的错误处理:未引发错误

Vba VBScript上的错误处理:未引发错误,vba,excel,vbscript,adsutil.vbs,Vba,Excel,Vbscript,Adsutil.vbs,若发生错误,那个么它将子显示CustomError,但不会引发异常。 预期结果-在objHTTP.send(json)之后,它应该抛出异常消息。我试过打错电话,但没什么问题。代码是用VBscript编写的 sub run On Error Resume Next wrapper.getVariable( "Plant_Price_PerKW" ).value = excel.range( "'Cases'!$H$331" ) wrapper.getVariable( "Net

若发生错误,那个么它将子显示CustomError,但不会引发异常。 预期结果-在objHTTP.send(json)之后,它应该抛出异常消息。我试过打错电话,但没什么问题。代码是用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
子运行
出错时继续下一步
wrapper.getVariable(“Plant\u Price\u PerKW”).value=excel.range(“'Cases'!$H$331”)
wrapper.getVariable(“净现值”).Value=excel.range(“'Cases'!$H$782”)
wrapper.getVariable(“IRR”).value=excel.range(“'Cases'!$H$783”)
暗消息
如果错误编号0和excel.range(“'Cases'!$H$783”)=”则
strMessage=“无法计算内部收益率。”
DisplayCustomError(strMessage)
WScript.Quit
其他错误编号0和(excel.range(“'Cases'!$H$783”)”)然后
strMessage=“无法计算其他输出。”
DisplayCustomError(strMessage)
WScript.Quit
如果结束
端接头
子显示CustomError(strMessage)
如果错误号为0,则
Dim errorMessage、objHTTP、URL、json、errorCode、uniqueId、networkInfo、jobId
errorMessage=“执行EVMLite.Error number时出错”&Err.number&“&Err.Description&&”&Err.Source&strMessage
errorCode=“ERR-1004”
uniqueId=wrapper.getVariable(“uniqueId”).value
设置networkInfo=CreateObject(“WScript.NetWork”)
jobId=networkInfo.ComputerName
设置objHTTP=CreateObject(“MSXML2.ServerXMLHTTP”)
URL=”http://10.93.244.224343:9005/vpp/logerror"
objHTTP.Open“POST”,URL,False
objHTTP.SetRequestHeader“内容类型”、“应用程序/json”
json=“{”“jobId”“:”“&jobId&”“,”“uniqueId”“:”“&uniqueId&”“,”“errorCode”“:”“&errorCode&”“,”“errorMessage”“:”“&errorMessage&”“}”
'MsgBox json
objHTTP.send(json)
错误转到0
调用Err.Raise(vbObjectError+10,“EVM执行失败”,errorMessage)
'MsgBox objHTTP.ResponseText
如果结束
端接头

VBScript在错误上实现
的有趣之处在于,它不是全局的,实际上受范围限制。因此,如果在Sub或函数中应用“错误时恢复下一步”,然后输入一个新函数或关闭它的Sub,则该设置将在Sub或函数退出时恢复

在您的情况下,您的
子运行
在错误恢复时设置
,然后调用
子显示customerror
,将
错误转到0
。仅当您仍在
DisplayCustomError
中时,此选项才适用。当由于
错误而退出时,您的
子运行
将继续,因为在该范围内,它仍然设置为
on Error.Resume Next

在调用
DisplayCustomError

下面是一个可以测试的VBS文件示例。如果运行此命令,将不会抛出任何内容,程序将显示消息“Done”。如果在
Sub1
中取消对该行的注释,则会引发错误“Example 2”


您正在使用“下一步继续执行错误时的
,这会使它忽略错误。删除它。@braX我试图在出错时删除Resume NextSub,它会引发异常,但它不会进入子显示CustomError(strMessage),当我第二次运行时,它会进入子显示CustomError(strMessage)找到一种方法来测试导致出现任何错误的条件,然后使用if语句来避免出现错误。根据错误的发生情况编写代码是一种不好的方式。我已将错误转到0并调用Err.Raise before DisplayCustomError(strMessage)并删除了WScript.Quit。现在它开始工作了,我想要它抛出错误。谢谢你的帮助。非常感谢。@DevendraVastrakar不客气!不要忘记单击投票按钮下方的勾号,将此答案标记为已接受。:)
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"