次のコードがあります。
def distributeMembersFile(members):
for node in members:
node = node.strip() # Strip trailing \n
if node == socket.hostname(): # No need to send the file to itself
continue
conn = None
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((node, port))
# TODO: Can possibly update the list of members here as well
s.sendall('DWLD')
s.recv(4)
except socket.error, msg:
logging.info(msg)
finally:
if s:
s.close()
さて、私の質問は、s.connect() が socket.error ブロック以外の try にあるにもかかわらず、その例外がキャッチされていないということです。コンソールに次のトレースバックが表示されます。
s.connect((node, port))
File "<string>", line 1, in connect
error: (111, 'Connection refused')
興味深いことに、他の場所でも socket.error ブロックを除いて同じ試行があり、この特定の (接続が拒否された) エラーは次のようにキャッチされます。
INFO (111, 'Connection refused')
上記は、except ブロックの logging.info 関数によって出力されました。この例外をキャッチする唯一の方法は、'bare' except を使用することですが、これはあまり良いことではありません。また、コンソールのエラーが
socket.error: (111、「接続が拒否されました」)
代わりに、それはただ言う
error: (111. 'Connection refused')
先頭の単語「ソケット」がありません。例外がキャッチされない理由は何でしょうか?