gpt4 book ai didi

Python socket编程——异常处理

转载 作者:可可西里 更新时间:2023-11-01 02:57:50 26 4
gpt4 key购买 nike

我正在用 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 block ?我是否也应该将 socket.socket 放入 try/catch block 中?

第二个问题,s.settimeout() 在我的情况下会做什么?据我了解文档,它会在 5 秒后抛出异常,但这是为了什么?只是 connect 还是对 sendallrecv 做同样的事情?

最佳答案

由于您在所有异常 block 中执行完全相同的操作并捕获相同的 socket.error 异常,因此您可以将 s.connect s.sendalls.recv 在同一个 try: block 中。像这样:

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 block 中而只放在 finally 中,您可以避免这种情况。

如果您确实打算以不同的方式处理每个错误,那么您可以像已有的那样将它们分开。 但请确保在异常 block 的末尾 break/return,这样您就不会尝试下一个。 socket examples ,通过在循环中使用 continue

如果您想在异常 block 中做一些不同的事情,嵌套它们会有所帮助。但如果不是这样,你每次都会重复 except block 。如果您想做一些不同的事情,当您退出嵌套的 try 时,您将不确定它已完成或引发异常的级别 - 需要使用标志值等。仅仅跟踪那个。因此,对于相同错误处理代码的示例,至少在 except block 中执行类似的操作:

except socket.error as e:
socket_error_handler(e, s)

def socket_error_handler(exception, socket):
#write error code to file
etc.

Should I put socket.socket into try/catch block too?

他们在上面链接的示例中这样做。

除了日志记录,您实际上不应该在每个阶段都进行相同的异常处理。可能需要单独处理它们。

第 2 部分:

s.settimeout(5.0) 为每个套接字操作设置超时,而不仅仅是第一次连接。还暗示它在 blocking mode 中.

关于Python socket编程——异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38544493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com