[英]Python socket programming - exception handling
我正在使用python开发一个基本的套接字客户端程序,但我不确定如何处理异常。 这是我到目前为止所做的:
TCP_IP = '..............'
TCP_PORT = 4950
MESSAGE = "o3"
BUFFER_SIZE = 2048
data = ""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5.0)
try:
s.connect((TCP_IP, TCP_PORT))
except socket.error:
#write error code to file
s.close()
try:
s.sendall(MESSAGE)
except socket.error:
#write to file or whatever
s.close()
try:
data = s.recv(BUFFER_SIZE)
except socket.error:
#write to file or whatever
s.close()
finally:
s.close()
代码按我的意愿工作,但是我不确定是否应该嵌套try / catch块? 我也应该将socket.socket
放入try / catch块中吗?
第二个问题,在我的情况下s.settimeout()
做什么? 据我了解的文档,它会在5秒后引发异常,但是那又是什么呢? 只是connect
否则sendall
和recv
会做同样的sendall
吗?
由于您在所有异常块中执行完全相同的操作并捕获相同的socket.error
异常,因此可以将s.connect
, s.sendall
和s.recv
放在同一try:
块中。 像这样:
try:
s.connect((TCP_IP, TCP_PORT))
s.sendall(MESSAGE)
data = s.recv(BUFFER_SIZE)
except socket.error:
#write error code to file
finally:
s.close()
请注意,由于s.close
也在示例的finally
部分中,因此即使发生异常,也将始终调用它。 因此,当您尝试关闭一个已经关闭的套接字时,您将遇到另一个异常。 通过不将其放置在except
块中,而仅将其放置在finally
,可以避免这种情况。
如果确实打算以不同的方式处理每个错误,则可以将它们分开保存。 但是请确保在异常块的末尾break
/ return
,以免您尝试下一个。 在套接字示例中 ,通过在循环中使用continue
来完成此操作。
如果您想在异常块中执行其他操作,则嵌套它们会有所帮助。 但是,如果不是这样,您将每次都重复except
块。 如果你想要做不同的事情,当你退出nested- try
S,你也不是一定的,其水平已经完成或引发异常-需要使用标志值等仅仅跟踪。 因此,对于您的相同错误处理代码示例,至少要在您的except
块中执行以下操作:
except socket.error as e:
socket_error_handler(e, s)
def socket_error_handler(exception, socket):
#write error code to file
etc.
我也应该将
socket.socket
放入try / catch块中吗?
他们在上面链接的示例中这样做。
除了日志记录,您实际上不应在每个阶段都执行相同的异常处理。 可能需要分别处理。
第2部分:
s.settimeout(5.0)
设置每个套接字操作的超时时间,而不仅仅是第一次连接。 也暗示它处于阻止模式 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.