繁体   English   中英

Python套接字编程-异常处理

[英]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否则sendallrecv会做同样的sendall吗?

由于您在所有异常块中执行完全相同的操作并捕获相同的socket.error异常,因此可以将s.connects.sendalls.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM