2012-11-20 28 views
0

我有一个vbscript函数从一个普通的URL创建一个tinyurl。如果TinyURL API不起作用会怎么样?

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

有没有一种保护措施,我可以添加到此功能,以防止出现错误,并使用它长的网址..?

提前许多感谢,

neojakey

回答

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 
+0

非常感谢,效果很好。为你+1 – neojakey

0

显然,你需要某种错误处理。一般来说,VBScript的错误处理并不好玩,但是对于你的规格 - 在任何/不关心什么问题的情况下获得正确的或默认的 - 你可以使用一个不错的和简单的方法:

Reduce your original功能

  1. 分配默认值与函数名(为失败做好准备)
  2. 上的错误继续下一步(禁用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的“端功能”行()。

补充:在通常的方式如果您关闭错误处理做到这一点(见丹尼尔·库克的建议)

评论(与“论错误继续下一步”就是这样),你是如履薄冰:所有的错误都是隐藏的,而不仅仅是你想要的;您的脚本将在所有下一行中执行操作,无论是否给予必要的前提条件或完成了准备工作。

所以您应该限制范围,以一个高风险行:

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 

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

相关问题