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

13

我正在尝试在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”(如果编写者遵循了文档),因此您可以捕获它并检查其类型。 - fjarri
3个回答

15

错误类型为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

1
您可以尝试这样做:

您可以尝试这样做:

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命令相关的错误与其他错误分开。 - SilentSteel

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接