我正在进行套接字连接,我想改进异常处理并且卡住了。每当我使用带有无效参数的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退出程序?
谢谢
答案 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