2012-11-14 22 views
2

我已經使用webclient.Agent編寫了http下載程序。使用webclient.Agent時connectionLost中可能出現的異常有哪些?

使用reason參數調用body消費者對象的connectionLost函數。

def connectionLost(self, reason): 
    if isinstance(reason.value, ResponseDone): 
     self.df.callback(None) 
    else: 
     self.df.errback(reason.value) 

我真的想知道什麼是可能的異常類的「理由」 ,因爲我需要趕上他們,並在使用inlineCallbacks呼叫 功能以後再處理。 到目前爲止,我認定:

ConnectError, BindError, ConnectionClosed, ResponseFailed

這是什麼地方記錄? 大多數文檔僅包含模糊的 「... errback與錯誤描述...」語句。

回答

2

你不需要特別注意它們。異常處理尊重繼承:如果你試圖捕獲一個基類並且引發一個子類,你也可以捕獲它。 Exception是幾乎所有Python中的異常的基類,所以如果你抓住了這一點,你幾乎可以捕捉到所有的東西。

try: 
    yield agent.request(...) 
except Exception as e: 
    print 'Oh no, some failure' 
else: 
    print 'Success' 

有所有的例外Agent.request可能會失敗,因爲它是不可能知道這個名單提前的不完整列表。失敗可能是由於連接設置引起的 - 但是它是純TCP連接還是HTTPS URL的SSL連接?也許這是由於不幸的用戶網絡配置而導致的SOCKS代理連接。這些可能都以不同的方式失敗。這同樣適用於實際的HTTP請求本身 - 誰知道服務器的行爲方式?也許它會以一個意想不到的錯誤代碼來響應,或者它可能會響應某些代理甚至無法解析並觸發低級別HTTP客戶端協議實現中的異常。解析器是手工製作的,因此可能有很多不同的例外可能來自這類問題。然後是內容和傳輸編碼的變化,這可能會調用很多不同的功能(例如gzip解碼器),這會增加更多可能的異常。

因此,不是試圖在每個使用Agent.request的地方想出所有這些例外的完整列表,而只是專門處理您所瞭解的異常類型,並具有特殊代碼,然後使用except Exception

相關問題