我有一个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
当tinyurlapi关闭或无法访问时,我遇到了这个问题,导致我的脚本失败:
msxml3.dll错误"80072efe"与服务器的连接异常终止
有没有一个我可以添加到这个函数中的保护措施来防止错误并使用它的长url。。?
非常感谢,
neojakey
如果您只想在呼叫失败时返回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
显然,您需要某种错误处理。总的来说,VBScript的错误处理并不有趣,但对于您的规格-在出现任何问题时获得正确的东西或默认值/不在乎什么问题-您可以使用一种简单的方法:
将原来的功能缩减为
- 将默认值分配给函数名称(为失败做准备)
- On Error Resume Next(禁用VBScript的默认错误处理,即崩溃)
- 将助手函数的返回值分配给函数名(为成功做准备)
在代码中:
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()的"End Function"行恢复。
添加:对常用方法的评论(参见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
这就是我说"没有乐趣"的意思。将有风险的代码放在函数中可以避免这种麻烦。