我正在使用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
也会这样做吗?
答案 0 :(得分:3)
由于您在所有异常阻止中执行完全相同的操作并捕获相同的abba [Indexes : 1,2,3,4]
abba [Indexes : 1,2,3,5]
baab [Indexes : 3,4,5,6]
baab [Indexes : 2,4,5,6]
异常,因此您可以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
,以免您尝试下一个。以这种方式完成socket examples,在循环中使用return
。
如果您想在异常块中执行不同的操作,嵌套它们会有所帮助。但如果不是,你每次都要重复continue
块。如果你想做一些不同的事情,当你退出嵌套 - except
时,你不能确定它已经完成或引发异常的哪个级别 - 需要使用标志值等来只跟踪那个。因此,对于相同错误处理代码的示例,至少应在try
块中执行以下操作:
except
我是否应该将
except socket.error as e: socket_error_handler(e, s) def socket_error_handler(exception, socket): #write error code to file etc.
放入try / catch块?
他们在上面链接的示例中这样做。
除了日志记录之外,您不应该在每个阶段都进行相同的异常处理。可能需要单独处理这些。
第2部分:
socket.socket
设置每个套接字操作的超时,而不仅仅是第一次连接。也暗示它在blocking mode。