0

我有一个 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 的保护措施..?

提前谢谢了,

新杰克

4

2 回答 2

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
于 2012-11-20T20:51:38.860 回答
0

显然,您需要某种错误处理。一般来说,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

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

于 2012-11-20T20:51:51.310 回答