使用webclient.Agent时connectionLost中可能有哪些例外?

时间:2012-11-14 11:10:17

标签: python http twisted webclient

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

使用reason参数调用body使用者对象的connectionLost函数。

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

我真的想知道' reason'中可能的异常类是什么? 因为我需要抓住所有这些并在电话中稍后处理它们 使用inlineCallbacks的函数。 到目前为止,我确定了:

ConnectError, BindError, ConnectionClosed, ResponseFailed

这是在某处记录的吗? 大多数文档都含糊不清 " ...错误描述错误..."语句。

1 个答案:

答案 0 :(得分:2)

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

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

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

因此,不要试图在您使用Agent.request的每个地方提出所有这些异常的完整列表,而只是专门处理您所知道的异常类型并拥有特殊代码,然后处理其他所有内容使用except Exception