【问题标题】:How to catch this Python exception: error: [Errno 10054] An existing connection was forcibly closed by the remote host如何捕获此 Python 异常:错误:[Errno 10054] 现有连接被远程主机强制关闭
【发布时间】:2013-09-20 21:01:27
【问题描述】:

我试图在 Python 2.7 中捕获这个特定的异常(并且只有这个异常),但我似乎找不到关于异常类的文档。有吗?

[Errno 10054] An existing connection was forcibly closed by the remote host

到目前为止我的代码:

try:
  # Deleting filename
  self.ftp.delete(filename)
  return True
except (error_reply, error_perm, error_temp):
  return False
except # ?? What goes here for Errno 10054 ??
  reconnect()
  retry_action()

【问题讨论】:

  • 最有可能的是,无论抛出什么,都源自内置的Exception(如果写此内容的人遵循docs),因此您可以捕获它并检查它的类型。

标签: python sockets exception python-2.7


【解决方案1】:

错误类型是socket.error,文档是here。 尝试像这样修改您的代码:

import socket
import errno  

try:
    Deleting filename
    self.ftp.delete(filename)
    return True
except (error_reply, error_perm, error_temp):
    return False
except socket.error as error:
    if error.errno == errno.WSAECONNRESET:
        reconnect()
        retry_action()
    else:
        raise

【讨论】:

    【解决方案2】:

    当您要过滤异常时,第一步是找出异常类型并将其添加到 except 子句中。这通常很容易,因为 python 会将其作为回溯的一部分打印出来。你没有提到类型,但对我来说它看起来像 socket.gaierror,所以我会这样做。

    下一步是找出异常内部的有趣之处。在这种情况下,`help(socket.gaierror)' 可以解决问题:我们可以使用一个名为 errno 的字段来确定要过滤哪些错误。

    现在,重新排列您的代码,以便在重试循环中捕获异常。

    import socket
    
    retry_count = 5  # this is configured somewhere
    
    for retries in range(retry_count):
        try:
            # Deleting filename
            self.ftp.delete(filename)
            return True
        except (error_reply, error_perm, error_temp):
            return False
        except socket.gaierror, e:
            if e.errno != 10054:
                return False
            reconnect()
    return False
    

    【讨论】:

      【解决方案3】:

      您可以尝试执行以下操作:

      try:
          # Deleting filename
          self.ftp.delete(filename)
          return True
      except (error_reply, error_perm, error_temp):
          return False
      except Exception, e:
          print type(e)  # Should give you the exception type
          reconnect()
          retry_action()
      

      【讨论】:

      • 只是想评论一下:这是一个很好的解决方案,因为它可以让您将与 FTP 命令相关的错误与其他错误分开。
      猜你喜欢
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 2012-02-07
      • 2016-08-18
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多