2016-07-23 14 views
0

私はPythonで基本的なソケットクライアントプログラムを開発しています。例外処理の仕方は完全にはわかりません。私が好きなPythonソケットプログラミング - 例外処理

TCP_IP  = '..............' 
TCP_PORT = 4950 
MESSAGE  = "o3" 
BUFFER_SIZE = 2048 
data  = "" 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

s.settimeout(5.0) 

try: 
    s.connect((TCP_IP, TCP_PORT)) 
except socket.error: 
    #write error code to file 
    s.close() 

try: 
    s.sendall(MESSAGE) 
except socket.error: 
    #write to file or whatever 
    s.close() 

try: 
    data = s.recv(BUFFER_SIZE) 
except socket.error: 
    #write to file or whatever 
    s.close() 

finally: 
    s.close() 

コードが動作しているが、私べき巣のtry/catchブロックかどうかはわからない:これは私が今までやったことありますか?私はsocket.socketをtry/catchブロックに入れるべきですか?

2番目の質問は、s.settimeout()は私の場合どうしますか?私がドキュメントを理解する限り、5秒後に例外がスローされますが、何のために? connectと同じですか、それともsendallrecvでも同じですか?

答えて

2

あなたはすべての例外ブロックでまったく同じ行動をしているし、同じsocket.error例外をキャッチしているので、あなたは同じtry:ブロックにs.connects.sendalls.recvを置くことができます。 s.closeはあなたの例ではfinallyセクションでもあることから、それは常に例外が発生した後でも、呼び出されますことを

try: 
    s.connect((TCP_IP, TCP_PORT)) 
    s.sendall(MESSAGE) 
    data = s.recv(BUFFER_SIZE) 
except socket.error: 
    #write error code to file 
finally: 
    s.close() 

注:そうのように。だから、すでに閉じられたソケットを閉じるときに別の例外が発生することになります。 exceptブロックに入れず、finallyに入れるだけで、そのような状況を回避できます。

異なる方法で各エラーを処理する予定がある場合は、既にあるように別々のエラーを処理することができます。 例外ブロックの最後にはbreak/returnにして、次のブロックを試行しないようにしてください。これは、socket examplesでは、ループ内でcontinueを使用することでそのように行われます。

例外ブロックで何か違うことをしたい場合は、それらをネストすると役に立ちます。しかし、そうでなければ毎回exceptブロックを繰り返すでしょう。そして、あなたが何か違うことをしたいなら、ネストしたtryを終了するときに、それが完了したか例外が発生したかは確かではありません。単にそれを追跡するためにフラグ値などを使う必要があります。だから、同じエラー処理コードのご例えば、非常に少なくとも、あなたのexceptブロックでは、このような何かを:

except socket.error as e: 
    socket_error_handler(e, s) 

def socket_error_handler(exception, socket): 
    #write error code to file 
    etc. 

は、私があまりにもtry/catchブロックにsocket.socketを置くべきか?

これは、上記のリンクされている例で行います。

ロギングとは別に、実際には各ステージで同じ例外処理を行うべきではありません。おそらくそれらを別々に扱う必要があります。

パート2:

s.settimeout(5.0)各ソケット操作のタイムアウトだけでなく、最初の接続を設定します。それがblocking modeにあることも意味します。

+0

この素晴らしい答えをありがとう!もう1つの質問ですが、元のバージョン(try/catchブロックを1つずつ使用する)と例外がsocket.connect()で捕捉されるとどうなりますか?すべてのソケット操作が正しく実行されていないと思いますか? –