2011-03-01 161 views

回答

29

如果你想得到錯誤代碼,這似乎是伎倆;

import errno 

try: 
    socketConnection() 
except socket.error, v: 
    errorcode=v[0] 
    if errorcode==errno.ECONNREFUSED: 
     print "Connection Refused" 

您可以查閱errno error codes

+6

在OSX上,'ECONNREFUSED'看起來是61而不是111,所以對111值進行硬編碼對於可移植性來說是個壞主意。 – jchl

+0

你是對的。我相信有更多這樣的案例。 –

+0

有一個'else:raise'很重要,否則所有其他的錯誤代碼將被默默地忽略! – jtpereyda

-1

這似乎很難做到可靠/可移植的,但也許是這樣的:

import socket 

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect(('localhost', 4167)) 
except socket.error, e: 
    if 'Connection refused' in e: 
     print '*** Connection refused ***' 

這將產生:

$ python socketexception.py 
*** Connection refused *** 

相當難吃雖然。

+0

爲什麼你會說這不可靠/不便攜?這是什麼「猥瑣的」? –

+2

因爲我不是100%確定在Windows上的異常消息將有「連接被拒絕」,並且不是像「無法連接」那樣相似但不同的東西。不確定這些錯誤消息是否標準化(例如:在POSIX中),並且並非所有平臺都必須符合POSIX標準。 –

+0

(-1)警告:這會在非英語區域中完全失敗。 – sum1stolemyname

26

在Unix平臺上,至少可以執行以下操作。

import socket, errno 
try: 
    # Do something... 
except socket.error as e: 
    if e.errno == errno.ECONNREFUSED: 
     # Handle the exception... 
    else: 
     raise 

的Python 2.6之前,使用e.args[ 0 ]代替e.errno

+3

通常優先使用'e.errno'而不是'e.args [0]'(對於使用errnos的異常)。 –

+1

我以爲這是開始,但在我的Mac上測試它似乎'socket.error'沒有'errno'成員。事實證明,在Python 2.6之前,'socket.error'不是'IOError'的子類,所以沒有'errno'成員。但是,當然,在Python 2.6之前,「除了t as e語法」也是無效的......我會更新我的代碼。 – jchl

0

我在Windows上開發,發現自己陷入了同樣的困境。但錯誤消息始終包含錯誤號。使用這些信息,我只是將異常轉換爲字符串str(Exception),將我想檢查的錯誤代碼轉換爲字符串str(socket.errno.ERRORX)並檢查錯誤代碼是否在異常中。

例如,用於連接復位異常:

except Exception as errorMessage: 
    if str(socket.errno.ECONNRESET) in str(errorMessage): 
     print("Connection reset") 
     #etc... 

這樣就避免了區域特定的解決方案,但仍不能獨立於平臺的不幸。