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)