Обработка ошибок на VBScript: не выдает ошибку

Если произошла ошибка, то она переходит к SubCustomError, но это не исключение. Ожидаемый результат - после 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

1 ответ

Решение

Самое смешное в реализации VBScript On Error является то, что это не глобально - это фактически ограничено областью действия. Итак, если вы подаете заявку On Error Resume Next в дополнительном элементе или функции, а затем введите новую функцию или вспомогательный элемент, который отключает ее, эта настройка отменяется при выходе из вспомогательного элемента или функции.

В вашем случае ваш Sub run наборы On Error Resume Next а потом звонит Sub DisplayCustomError который устанавливает On Error GoTo 0, Это относится только тогда, когда вы еще внутри DisplayCustomError, Когда он выходит из-за Err.Raise, ваш Sub run будет продолжаться, потому что в этом объеме он по-прежнему установлен на On Error Resume Next,

Вам нужно будет явно указать On Error GoTo 0 в Sub run прежде чем позвонить DisplayCustomError

Вот пример файла 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"
Другие вопросы по тегам