2

我已经使用 webclient.Agent 编写了一个 http 下载器。

主体消费者对象的 connectionLost 函数使用原因参数调用。

def connectionLost(self, reason):
    if isinstance(reason.value, ResponseDone):
        self.df.callback(None)
    else:
        self.df.errback(reason.value)

我真的很想知道“原因”中可能的异常类是什么,因为我需要将它们全部捕获并稍后在使用 inlineCallbacks 的调用函数中处理它们。到目前为止,我确定:

ConnectError, BindError, ConnectionClosed, ResponseFailed

这是在某处记录的吗?大多数文档只包含含糊的“...errback with a description of the error ...”语句。

4

1 回答 1

2

你不需要专门捕捉它们。异常处理尊重继承:如果你试图捕捉一个基类并引发了一个子类,你也会捕捉到它。 Exception是 Python 中几乎所有异常的基类,所以如果你抓住了它,你就会抓住几乎所有的东西。

try:
    yield agent.request(...)
except Exception as e:
    print 'Oh no, some failure'
else:
    print 'Success'

没有所有例外的完整列表Agent.request可能会失败,因为不可能提前知道这个列表。失败可能是由于连接设置 - 但它是普通 TCP 连接还是 HTTPS URL 的 SSL 连接?由于不幸的用户网络配置,可能是通过 SOCKS 代理建立的连接。这些都可能以不同的方式失败。这同样适用于实际的 HTTP 请求本身——谁知道服务器的行为?也许它会响应一个意外的错误代码,或者它会响应一些 Agent 甚至无法解析并触发低级 HTTP 客户端协议实现的异常。解析器是手工制作的,所以可能有很多不同的异常可能来自这种问题。然后是内容和传输编码的变化,

因此,与其尝试在您使用的每个地方都列出所有这些异常的完整列表,不如Agent.request只专门处理您知道的异常类型并为其编写特殊代码,然后使用except Exception.

于 2012-11-14T17:28:45.767 回答