Python套接字连接异常

erl*_*ing 11 python sockets exception-handling exception

我有一个socket连接,我想改进异常处理,我卡住了.每当我使用带有无效参数的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()
Run Code Online (Sandbox Code Playgroud)

该类可能看起来有点奇怪,但它用于从另一台运行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)
Run Code Online (Sandbox Code Playgroud)

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

self.sock.connect(server_address)
Run Code Online (Sandbox Code Playgroud)

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

except Exception, msg:
Run Code Online (Sandbox Code Playgroud)

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

谢谢

mha*_*wke 16

如果您选择了随机但有效的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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

except Exception,msg:
Run Code Online (Sandbox Code Playgroud)

但是从Python 2.6+开始,您应该使用as语句而不是逗号,如下所示:

except Exception as msg:
Run Code Online (Sandbox Code Playgroud)

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

except socket.error as msg:
Run Code Online (Sandbox Code Playgroud)

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

except socket.error as msg:
    print "Socket Error: %s" % msg
except TypeError as msg:
    print "Type Error: %s" % msg
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的输入,但在更改超时后,我现在能够捕获异常,即使我不使用"as".结肠错位是一个错字. (2认同)