2013-10-05 63 views
2

目前,我有,我得到一個NameError以下代碼的問題:如何處理ConnectionError在Python

try: 
    # some network programming raising an exception 
except ConnectionError: 
    # some error handling 

這是不行的,因爲你必須從一些模塊,這是沒有提及進口ConnectionError在文檔中(也許我只是失明?)。 我發現的全部是this,但它指的是另一個請求庫。

+0

看起來您正在使用請求?它的文檔位於http://docs.python-requests.org/en/latest/ – ninMonkey

+0

我正在使用http.client.HTTPConnection – mafrasi2

+0

您使用的是哪個Python版本?從'http.client.HTTPConnection'顯然是3.x.但是如果你在'ConnectionError'上得到一個'NameError',它不是3.2,3.3或3.4。 – abarnert

回答

1

標準庫中的所有預期爲「通用」的異常都是內置的,並在庫參考的Built-in Exceptions部分有記錄。

在3.3,其包括這一個:

例外ConnectionError

用於連接相關的問題的基類。

子類是BrokenPipeError,ConnectionAbortedError,ConnectionRefusedErrorConnectionResetError

但是這是一個內置的。所以這應該工作:

except ConnectionError: 

在3.0-3.2,有沒有這樣的例外,因爲ConnectionError。 stdlib中沒有提到任何這個名字。所以嘗試處理它沒有意義。 (關於OSErrorIOError和是如何3.2和3.3之間重組的說明見PEP 3151。)

3.2當量的ConnectionErrorOSError與某些errno值。所以,你要的是一樣的東西:

except OSError as e: 
    if e.errno not in (EPIPE, ESHUTDOWN, ECONNABORTED, ECONNREFUSED, ECONNRESET): 
     raise 
    # whatever you wanted to do for ConnectionError. 

同時,在將來,當你不知道你需要處理什麼樣的異常,這是很容易測試。首先,編寫一些測試代碼,通過記錄異常類型的限定名稱來處理任何異常。然後從日誌中取出該類型並在真實代碼中使用該類型。

try: 
    code_that_raises() 
except Exception as e: 
    print(type(e), type(e).__qualname__, whatever_else_looks_useful(e)) 
+0

我正在運行python 3.2.3,但這也不起作用。我無法導入異常模塊,也沒有導入我得到另一個異常的NameError :( – mafrasi2

+1

@ mafrasi2:OK,updated; 3.2與3.1相同,與3.3不一樣,不存在「ConnectionError」這樣的錯誤 – abarnert

+0

哇,我不敢相信,這是真的,但你是如此正確。我從來沒有得到一個ConnectionError,它是一個socket.error – mafrasi2