显然,您需要某种错误处理。一般来说,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() 的“结束函数”行/处恢复。
补充:对通常做法的评论(参见 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
当我说“不好玩”时,这就是我的意思。将有风险的代码放入函数中将避免这种麻烦。