2013-02-16 4 views
7

私は、次のコードを持っている:Python:ソケットエラーとタイムアウトを区別する方法は?

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

私はrecvのタイムアウト例外を発生させる方法をテストするためにsendall機能をコメントしています。 しかし、問題はsocket.error例外が発生することです。 私は、コードの最後の行を変更した場合:

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

それから私はsocket.timeout例外を取得します。 実際にどのような例外が生成されますか?

答えて

17

socket.timeoutsocket.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.error秒、特にsocket.timeoutをキャッチしてみてください。

関連する問題