Python套接字编程 - 异常处理

时间:2016-07-23 17:17:05

标签: python sockets tcp client

我正在使用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秒后抛出一个异常,但为了什么?只需connectsendallrecv也会这样做吗?

1 个答案:

答案 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.errors.connects.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

相关问题