如果TinyURL API不起作用怎么办?

时间:2012-11-20 20:00:37

标签: asp-classic vbscript

我有一个vbscript函数可以从常规URL创建一个tinyurl。

FUNCTION GetShortURL(strUrl)
  Dim oXml,strTinyUrl,strReturnVal
  strTinyUrl = "http://tinyurl.com/api-create.php?url=" & strUrl
  set oXml = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
  oXml.Open "GET", strTinyUrl, false
  oXml.Send
  strReturnVal = oXml.responseText
  Set oXml = nothing
  GetShortURL = strReturnVal
END FUNCTION

当tinyurl api关闭或无法访问时,我遇到了问题,使我的脚本失败:

MSXML3.DLL 错误'80072efe' 与服务器的连接异常终止

我是否可以添加此功能以防止错误并使用它具有的长网址??

非常感谢,

neojakey

2 个答案:

答案 0 :(得分:1)

如果您想在呼叫失败时返回strUrl,可以使用On Error Resume Next

FUNCTION GetShortURL(strUrl)
  on error resume next
  Dim oXml,strTinyUrl,strReturnVal
  strTinyUrl = "http://tinyurl.com/api-create.php?url=" & strUrl
  set oXml = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
  oXml.Open "GET", strTinyUrl, false
  oXml.Send
  strReturnVal = oXml.responseText
  Set oXml = nothing
  'Check if an error occurred.
  if err.number = 0 then
     GetShortURL = strReturnVal
  else
     GetShortURL = strUrl
  end if
END FUNCTION

答案 1 :(得分:0)

显然,您需要某种错误处理。一般来说,VBScript的错误处理并不好玩,但是对于你的规范 - 在任何/不关心什么问题的情况下得到正确的东西或默认值 - 你可以使用一个简单的方法:< / p>

将原来的功能减少到

  1. 将默认值分配给函数名称(以准备失败)
  2. On Error Resume Next(禁用VBScript&#39;默认错误处理,即崩溃)
  3. 将辅助函数的返回值赋值给函数名(准备成功)
  4. 在代码中:

    Function GetShortURL2(strUrl)
      GetShortURL2 = strUrl
     On Error Resume Next
      GetShortURL2 = [_getshorturl](GetShortURL2)
    End Function
    

    我使用[]来使用非法的&#39;函数名,因为我想强调不应该直接调用_getshorturl()。 _getshorturl()中的任何错误都会导致跳过赋值和下一行/的恢复(离开函数,返回默认值,重置为默认错误处理)。

    辅助功能包含关键部分&#39;原来的功能:

    Function [_getshorturl](strUrl)
      Dim oXml : Set oXml = CreateObject("Msxml2.ServerXMLHTTP.3.0")
      oXml.Open "GET", "http://tinyurl.com/api-create.php?url=" & strUrl, False
      oXml.Send
      [_getshorturl] = oXml.responseText
    End Function
    

    无论哪个操作失败,程序流程都将在&#34; End Function&#34;上恢复。 GetShortURL2()。

    的一行

    已添加:评论通常的做法(参见Daniel Cook的建议)

    如果你关闭错误处理(&#34; On Error Resume Next&#34;就是这样),你就会陷入困境:所有的错误都被隐藏起来,而不仅仅是你所重视的错误;无论是否有必要的先决条件或准备工作,您的脚本都会在所有Next行中执行操作。

    因此,您应该将范围限制为一个有风险的行:

    Dim aErr
    ...
    On Error Resume Next
       SomeRiskyAction
       aErr = Array(Err.Number, Err.Description, Err.Source)
    On Error Goto 0
    If aErr(0) Then
       deal with error
    Else
       normal flow
    End If
    

    或在OERN范围内的每一行之后检查

    On Error Resume Next
       SomeRiskyAction1
       If Err.Number Then
          deal with error
       Else
          SomeRiskyAction2
          If Err.Number Then
             deal with error
          Else
             ...
          End If
       End If
    

    这就是我的意思,当我说&#34;没有乐趣&#34;。将风险代码放在函数中将避免这种麻烦。