问题 如何捕获此Python异常:错误:[Errno 10054]远程主机强制关闭现有连接


我试图在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()

3926
2017-09-16 16:11


起源

最有可能的是,无论抛出什么,都来自内置 Exception (如果有人写了这个 文档),所以你可以抓住它并检查它的类型。 - fjarri


答案:


错误类型是socket.error,文档是 这里。 尝试修改你的代码,如下所示:

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

12
2017-11-25 08:22





您可以尝试做类似的事情:

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()

1
2017-09-16 16:18



只是想评论:这是一个很好的解决方案,因为它允许您将FTP命令相关的错误与其他错误分开。 - SilentSteel


当您想要过滤异常时,第一步是找出异常类型并将其添加到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

1
2017-09-16 16:34