Python套接字连接异常

时间:2014-08-22 13:07:22

标签: python sockets exception exception-handling

我正在进行套接字连接,我想改进异常处理并且卡住了。每当我使用带有无效参数的socket.connect(server_address)函数时,程序就会停止,但似乎没有抛出任何异常。继承我的代码

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

该类可能看起来有点奇怪,但它用于从另一台运行ARToolKit的计算机接收坐标。无论如何,问题出在函数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)

如果我使用随机IP地址和portnumber调用该函数,整个程序就会停在该行:

self.sock.connect(server_address)

我读过的文档指出,如果出现错误,它将抛出一个socket.error-exception。我也尝试过:

except Exception, msg:

如果我没有弄错的话,这将会捕获任何异常,但仍然没有结果。我非常感谢你的帮助。此外,当发生意外异常时,是否可以使用sys.exit退出程序?

谢谢

2 个答案:

答案 0 :(得分:14)

如果您选择了一个随机但有效的IP地址和端口,socket.connect()将尝试建立与该端点的连接。默认情况下,如果没有为套接字设置显式超时,它将在执行此操作时阻塞并最终超时,从而引发异常socket.error: [Errno 110] Connection timed out

我机器上的默认超时为120秒。也许你没有等待socket.connect()返回(或超时)?

您可以尝试减少超时:

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

请注意,如果为套接字显式设置了超时,则异常将是socket.timeout,它是从socket.error派生的,因此将被上述except子句捕获。

答案 1 :(得分:5)

上一个常规异常的问题是冒号放置。它需要在整个异常之后,而不是在except语句之后。因此,要捕获您需要执行的所有异常:

except Exception,msg:

但是从Python 2.6+开始,你应该使用as语句而不是像这样的逗号:

except Exception as msg:

我能够正常运行代码(注意你需要在连接方法中输入一个元组)。如果您只想专门捕获套接字错误,那么除了socket.error类之外,您还需要它。就像你有:

except socket.error as msg:

如果要确保输入元组,只需添加另一个异常循环:

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