7

私は次のコードを持っています:

try:
    while 1:
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.settimeout(5);
        s.connect((HOST,PORT))
        print("before send")
        #time.sleep(10);
        #s.sendall('GET / HTTP/1.1\r\nConnection: Keep-Alive\r\nHost: www.google.lt\r\n\r\n')
        data=s.recv(52)
        print("after send");
        s.close()
        if string.find(data,"HTTP/1.1 200 OK") == -1:
            print("Lost Connection")
        print(data)
        time.sleep(2)
except KeyboardInterrupt:
    print("CTRL C occured")
except socket.error:
    print("socket error occured: ")
except socket.timeout:
    print("timeout error")

sendall 関数にコメントを付けて、recv がタイムアウト例外を生成する方法をテストしました。しかし、問題は、socket.error 例外が発生することです。コードの最後の行を次のように変更した場合:

except socket.timeout:
    print("timeout error")
except socket.error:
     print("socket error occured: ")

次に、socket.timeout 例外が発生します。では、実際にどのような例外が生成されるのでしょうか?

4

1 に答える 1

20

socket.timeoutのサブクラスですsocket.error。本当にそれsocket.timeoutです。socket.error最初にキャッチすると、より一般的なケースがキャッチされます。

>>> issubclass(socket.timeout, socket.error)
True

このコードは正しいです:

except socket.timeout:
 print("timeout error")
except socket.error:
 print("socket error occured: ")

socket.timeout特に をキャッチしてから、他のをキャッチしてみてくださいsocket.error

于 2013-02-16T18:56:17.257 に答える