Python套接字连接异常

Python套接字连接异常,python,sockets,exception,exception-handling,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 se

我有一个套接字连接正在进行,我想改进异常处理,我卡住了。每当我使用带有无效参数的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()
如果我使用随机IP地址和端口号调用该函数,整个程序就会停在该行:

self.sock.connect(server_address)
我读过的文档说明,如果发生错误,它将抛出socket.error-exception。我还尝试了以下方法:

except Exception, msg:
如果我没有弄错的话,这将捕获任何异常,但仍然不会产生任何结果。我将非常感谢你的帮助。另外,当出现不需要的异常时,可以使用sys.exit退出程序吗


谢谢

您最后一个一般例外的问题是冒号的位置。它需要在整个异常之后,而不是在except语句之后。因此,要捕获所有异常,您需要执行以下操作:

except Exception,msg:
但是,在Python 2.6+中,应该使用as语句,而不是逗号,如下所示:

except Exception as msg:
我能够很好地运行代码(注意,您需要在connect方法中加入一个元组)。如果您想专门捕获套接字错误,则需要除去
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

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

我的机器上的默认超时为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子句捕获。

如何启动程序?您确定您的打印没有进入/dev/null或其他位置吗?还有一些异常继承自BaseException,所以如果您真的非常绝望,您也可以尝试捕获它(包括sys.exit和键盘中断),谢谢兄弟!这就是问题所在,我手动终止了程序,而不是等待超时。因此,如果超时设置为
None
,您说120秒后仍然会出现超时异常(或其他默认情况)?如何获取/设置此默认值?@ItamarKatz:该超时是系统定义的。在Linux(和其他Unix变体)中,它是由建立连接的重试次数间接控制的——实际上是尝试获取对SYN数据包的响应的次数。您可以通过cat/proc/sys/net/ipv4/tcp\u syn\u重试查看设置。您还可以通过修改该特殊文件来更改它。退休通常使用指数退避算法发送,该算法增加重试间隔,例如3、7、15、31秒。我的Linux系统将“tcp_syn_retries”(tcp_syn_retries)(tcp_syn_retries)(代码)设置为5,这大约是120秒。@ItamarKatz:更改该设置会影响系统上的所有进程,因此我建议不要这样做。如果要设置超时,请使用
socket.settimeout()
进行设置。如果您希望超时时间大于操作系统允许的超时时间,则需要通过在Python中执行自己的重试来处理超时时间。非常感谢。实际上,我正试图做与限制使用超时相反的事情——我的服务器脚本抛出连接超时的异常,我不明白为什么,我希望它“永远”等待。我正在使用
select
,然后才使用
socket.recv
读取,这就是为什么我不明白为什么会发生此异常。感谢您的输入,但是更改超时后,我现在能够捕获异常,即使我不使用“as”。结肠错位是个打字错误。
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