Excepción de conexión de socket Python

Tengo una conexión de zócalo en marcha y quiero mejorar el manejo de excepciones y estoy atascado. Siempre que uso la función socket.connect (server_address) con un argumento no válido, el progtwig se detiene, pero parece que no se producen excepciones. Aquí está mi código

import socket import sys import struct class ARToolkit(): def __init__(self): self.x = 0 self.y = 0 self.z = 0 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.logging = False def connect(self,server_address): try: self.sock.connect(server_address) except socket.error, msg: print "Couldnt connect with the socket-server: %s\n terminating program" % msg sys.exit(1) def initiate(self): self.sock.send("start_logging") def log(self): self.logging = True buf = self.sock.recv(6000) if len(buf)>0: nbuf = buf[len(buf)-12:len(buf)] self.x, self.y, self.z = struct.unpack("<iii", nbuf) def stop_logging(self): print "Stopping logging" self.logging = False self.sock.close() 

La clase puede parecer un poco extraña, pero se usa para recibir coordenadas de otra computadora que ejecuta ARToolKit. De todos modos, el problema está en la función connect() :

 def connect(self,server_address): try: self.sock.connect(server_address) except socket.error, msg: print "Couldnt connect with the socket-server: %s\n terminating program" % msg sys.exit(1) 

Si llamo a esa función con una dirección IP aleatoria y número de puerto, todo el progtwig simplemente se detiene en la línea:

 self.sock.connect(server_address) 

La documentación que he leído indica que, en caso de error, lanzará una excepción socket.error. También he intentado con sólo:

 except Exception, msg: 

Esto, si no me equivoco, detectará excepciones, y aún así no dará ningún resultado. Estaría muy agradecido por una mano amiga. Además, ¿está bien salir de los progtwigs que utilizan sys.exit cuando se produce una excepción no deseada?

Gracias

Si ha elegido una dirección IP y un puerto aleatorios, pero válidos, socket.connect() intentará establecer una conexión con ese punto final. De manera predeterminada, si no se establece un tiempo de espera explícito para el zócalo, se bloqueará mientras lo hace y, finalmente, se socket.error: [Errno 110] Connection timed out tiempo de espera, lo que socket.error: [Errno 110] Connection timed out excepción socket.error: [Errno 110] Connection timed out .

El tiempo de espera predeterminado en mi máquina es de 120 segundos. ¿Quizás no está esperando el tiempo suficiente para que socket.connect() regrese (o se socket.connect() tiempo de espera)?

Puedes intentar reducir el tiempo de espera de esta manera:

 import socket s = socket.socket() s.settimeout(5) # 5 seconds try: s.connect(('123.123.123.123', 12345)) # "random" IP address and port except socket.error, exc: print "Caught exception socket.error : %s" % exc 

Tenga en cuenta que si se establece explícitamente un tiempo de espera para el socket, la excepción será socket.timeout que se deriva de socket.error y, por lo tanto, será capturada por la cláusula de excepción anterior.

El problema con su última excepción general es la colocación de dos puntos. Debe ser después de la excepción completa, no después de la statement de excepción. Por lo tanto, para capturar todas las excepciones que necesitarías hacer:

 except Exception,msg: 

Sin embargo, desde Python 2.6+ debe usar la instrucción as en lugar de una coma como esta:

 except Exception as msg: 

Pude ejecutar el código correctamente (tenga en cuenta que debe incluir una tupla en el método de conexión). Si desea capturar específicamente solo los errores de socket, entonces necesitará la clase socket.error . Como usted tiene

 except socket.error as msg: 

Si desea asegurarse de que se ingresa una tupla, simplemente agregue otro bucle de excepción:

 except socket.error as msg: print "Socket Error: %s" % msg except TypeError as msg: print "Type Error: %s" % msg