2011-11-25 3 views
5

pythonsエラー処理のための構文try:except:finally:の構文を理解しています。私が理解できないことは、読みやすいコードを作るために適切なエラー名を見つける方法です。例えばPythonでエラーコードを理解し、意味のあるエラー名を使用する

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST, PORT)) 
    s.settimeout(60)    
    char = s.recv(1) 

except socket.timeout: 
    pass 

ので、ソケットがタイムアウトを発生させた場合、エラーがキャッチされます。どうか私は接続が拒否されて探しています。私は、エラー番号が10061であることを知っています。文書の中で、タイムアウトなどの意味のフルネームを見つける場所を探します。他のPythonモジュールを探すのに似た場所があるでしょうか?私はこれが初心者の質問であることを知っていますが、実際にはエラーの説明と名前を探す場所を知らなくても、私のコードを今までどおり処理しています。

編集:

ご回答ありがとうございます。

except socket.error, exception: 
    if exception.errno == ETIMEDOUT: 
     pass 

あなたはerrnoマニュアルに記載されてerrnoに、とエラーになります

except socket.timeout: 
    pass 

答えて

5

あなたが望むものを達成するために、あなたは、発生した例外をつかむに格納されているエラーコードを抽出し、errno codesに対して、いくつかのif比較を行う必要があります:

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST, PORT)) 
    s.settimeout(60)    
    char = s.recv(1) 
except socket.error, exception: 
    if exception.errno == errno.ECONNREFUSED: 
     # this is a connection refused 
    # or in a more pythonic way to handle many errors: 
    { 
     errno.ECONNREFUSED : manage_connection_refused, 
     errno.EHOSTDOWN : manage_host_down, 
     #all the errors you want to catch 
    }.get(exception.errno, default_behaviour)() 
except socket.timeout: 
    pass 

と:

def manage_connection_refused(): 
    print "Connection refused" 

def manage_host_down(): 
    print "Host down" 

def default_behaviour(): 
    print "error" 
2

と同じ結果を達成するであろう。 10061はWinSockに対してのみ有効です。

+0

okどうすれば例外をキャッチするのですか?errno.ECONNREFUSED – Richard

+1

あなたはsocket.errorを捕まえ、コードをチェックします。 – unbeli

0

socketによると、socket.errorの値はerrnoモジュールで定義されています。

関連する問題