【问题标题】:What if TinyURL API doesn't work..?如果 TinyURL API 不起作用怎么办..?
【发布时间】:2012-11-21 05:15:21
【问题描述】:

我有一个 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” 与服务器的连接异常终止

我可以在这个函数中添加一个保护措施来防止错误并使用它的长 url..?

非常感谢,

neojakey

【问题讨论】:

    标签: asp-classic vbscript


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      显然,您需要某种错误处理。一般来说,VBScript 的错误处理并不有趣,但对于您的规范 - 获取正确的东西或默认值以防万一/不关心什么问题 - 您可以使用一个很好且简单的方法:

      把你原来的功能减少到

      1. 为函数名分配默认值(为失败做准备)
      2. On Error Resume Next(禁用 VBScript 的默认错误处理,即崩溃)
      3. 将辅助函数的返回值分配给函数名(为成功做准备)

      在代码中:

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

      我使用 [] 是为了能够使用“非法”函数名,因为我想强调不应该直接调用 _getshorturl()。 _getshorturl() 中的任何错误都将导致分配跳过并在下一行恢复(离开函数,返回默认值,重置为默认错误处理)。

      辅助函数包含原始函数的“关键部分”:

      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
      

      无论哪个操作失败,程序流程都将在 GetShortURL2() 的“结束函数”行/处恢复。

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

      如果您关闭错误处理(并且“On Error Resume Next”就是这样),您就如履薄冰:所有错误都被隐藏了,而不仅仅是您侦察的错误;无论是否提供必要的先决条件或准备工作,您的脚本都会在所有 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
      

      当我说“不好玩”时,这就是我的意思。将有风险的代码放在函数中可以避免这种麻烦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-02
        • 1970-01-01
        • 2022-06-11
        • 2013-10-01
        • 1970-01-01
        • 2018-01-20
        • 2010-11-09
        • 1970-01-01
        相关资源
        最近更新 更多