2011-03-01 5 views
21

こんにちは私は特定のエラーコードを処理する方法が不思議です。例えば、[Errno 111] Connection refusedPythonは特定のエラーコードを処理していますか?

私はこの特定のエラーをソケットモジュールでキャッチして何かを印刷したいと思っています。得

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 *** 

答えて

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'は111ではない61のように見えるので、111の値をハードコーディングすることは移植性にとっては悪い考えです。 – jchl

+0

あなたは絶対に正しいです。私はそのような場合がもっとあると確信しています。 –

+0

'else:raise'を持つことが重要です。そうしないと、他のすべてのエラーコードが暗黙に無視されます! – jtpereyda

-1

これは以下のように確実に/ポータブルにおそらく何かをするのは難しいようです。

+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.args [0]'の代わりに 'e.errno'を使うのが好ましい(errnosを使う例外の場合)。 –

+1

私はまず、Macでは、socket.errorには 'errno'メンバーがないように見えると思っていました。 Python 2.6より前では、 'socket.error'は' IOError'のサブクラスではなかったので、 'errno'メンバはありませんでした。もちろん、Python 2.6より前の 'except as e as'構文も有効ではありませんでした...私は自分のコードを更新します。 – 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... 

これは、ロケール固有のソリューションを避けたが、残念ながら、まだプラットフォームに依存しないではありません。

関連する問題