2012-11-20 47 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 

這就是我的意思,當我說「不好玩」。將有風險的代碼放在函數中可以避免這種麻煩。

相關問題