显然,您需要某种错误处理。一般来说,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
当我说“不好玩”时,这就是我的意思。将有风险的代码放在函数中可以避免这种麻烦。