1

次のコードがあります。

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') 

先頭の単語「ソケット」がありません。例外がキャッチされない理由は何でしょうか?

4

0 に答える 0