Vbscript msxml12.XMLHTTP错误处理

时间:2014-07-21 11:28:36

标签: vbscript xmlhttprequest

我使用这个vbscript代码来下载网页:

Dim oXML
Set oXML = CreateObject("msxm12.XMLHTTP")
oXML.Open "GET", "mysite.com", False
oXML.Send

如果没有此类网站,我收到错误80004005, Unspecified error at line "oXML.Open ..."

如何在vbscript中处理此错误?我想抓住这个错误并向我的错误显示msgbox,即网页不可用。

2 个答案:

答案 0 :(得分:4)

您的脚本中至少有三个可能的失败点。

  1. CreateObject可能会失败;例如如果你使用msxml12(数字1)而不是msxml2(字母l)。在开发过程中应该修复这些错误。
  2. 。开放可能会失败;例如如果您使用“mysite.com”而不是语法正确的URL。如果你在运行时获得了URL,建议你选择“先跳后检查”,OERN可以用来捕获验证中找不到的错误URL。
  3. 。发送可能会失败;例如如果网站已关闭或被遗弃。这是OERN的一个明显案例。
  4. 最重要的规则是 OERN:保持本地和短暂(OERN和OEG0之间只有一条风险线)。

    演示代码:

    Option Explicit
    
    Dim sUrl
    For Each sUrl In Split("http://stackoverflow.com http://pipapo.org mysite.com")
        Dim oXML, aErr
    '   Set oXML = CreateObject("msxm12.XMLHTTP")
        Set oXML = CreateObject("msxml2.XMLHTTP.6.0")
       On Error Resume Next
        oXML.Open "GET", sUrl, False
        aErr = Array(Err.Number, Err.Description)
       On Error GoTo 0
        If 0 = aErr(0) Then
          On Error Resume Next
           oXML.Send
           aErr = Array(Err.Number, Err.Description)
          On Error GoTo 0
           Select Case True
             Case 0 <> aErr(0)
               WScript.Echo "send failed:", aErr(0), aErr(1)
             Case 200 = oXML.status
               WScript.Echo sUrl, oXML.status, oXML.statusText
             Case Else
               WScript.Echo "further work needed:"
               WScript.Echo sUrl, oXML.status, oXML.statusText
           End Select
        Else
           WScript.Echo "open failed:", aErr(0), aErr(1)
        End If
    Next
    

    输出:

    cscript 24863986.vbs
    http://stackoverflow.com 200 OK
    send failed: -2146697211 The system cannot locate the resource specified.
    
    open failed: -2147012890 System error: -2147012890.
    

答案 1 :(得分:1)

但你的问题是msxml2.http(El 2)而不是msxm12.http(1 2)。 Yopur错误是因为你没有成功创建对象或测试对象不是空的。

网址必须100%正确。与浏览器不同,没有代码可以修复网址。

我的程序的目的是获取错误详细信息。

我如何获得正确的网址是在浏览器中输入我的网址,导航,并且正确的网址通常位于地址栏中。另一种方法是使用链接等的属性来获取URL。

Microsoft.XMLHTTP也映射到Microsoft.XMLHTTP.1.0。 HKEY_CLASSES_ROOT \ Msxml2.XMLHTTP映射到Msxml2.XMLHTTP.3.0。再试一次

使用xmlhttp尝试这种方式。编辑网址等。如果它似乎工作注释if / end if转储信息,即使看起来工作。它是vbscript但vbscript在vb6中工作。

 On Error Resume Next
 Set File = WScript.CreateObject("Microsoft.XMLHTTP")
 File.Open "GET", "http://www.microsoft.com/en-au/default.aspx", False
 'This is IE 8 headers
 File.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET4.0C; .NET4.0E; BCD2000; BCD2000)"
 File.Send
 If err.number <> 0 then 
    line =""
    Line  = Line &  vbcrlf & "" 
    Line  = Line &  vbcrlf & "Error getting file" 
    Line  = Line &  vbcrlf & "==================" 
    Line  = Line &  vbcrlf & "" 
    Line  = Line &  vbcrlf & "Error " & err.number & "(0x" & hex(err.number) & ") " & err.description 
    Line  = Line &  vbcrlf & "Source " & err.source 
    Line  = Line &  vbcrlf & "" 
    Line  = Line &  vbcrlf & "HTTP Error " & File.Status & " " & File.StatusText
    Line  = Line &  vbcrlf &  File.getAllResponseHeaders
    wscript.echo Line
    Err.clear
    wscript.quit
 End If

On Error Goto 0

 Set BS = CreateObject("ADODB.Stream")
 BS.type = 1
 BS.open
 BS.Write File.ResponseBody
 BS.SaveToFile "c:\users\test.txt", 2

同时查看这些其他对象是否有效。

C:\Users>reg query hkcr /f xmlhttp

HKEY_CLASSES_ROOT\Microsoft.XMLHTTP
HKEY_CLASSES_ROOT\Microsoft.XMLHTTP.1.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.3.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.4.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.5.0
HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.6.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.3.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.4.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.5.0
HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.6.0
End of search: 12 match(es) found.

另请注意,在发生锁定之前,您可以调用任何特定XMLHTTP对象的次数有限制。如果发生这种情况,并且在调试代码时会发生这种情况,只需更改为其他xmlhttp对象

即可