【问题标题】:What are the possible exceptions in connectionLost when using webclient.Agent?使用 webclient.Agent 时 connectionLost 可能出现哪些异常?
【发布时间】:2012-11-14 11:10:16
【问题描述】:

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

body消费者对象的connectionLost函数被调用一个reason参数。

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..." 语句。

【问题讨论】:

    标签: python http twisted webclient


    【解决方案1】:

    您无需专门捕获它们。异常处理尊重继承:如果你试图捕捉一个基类并引发了一个子类,你也会捕捉到它。 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 客户端协议实现的异常。解析器是手工制作的,所以可能有很多不同的异常可能来自这种问题。然后是内容和传输编码的变化,这可能会调用许多不同的功能(例如,gzip 解码器),这会增加更多可能的异常。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多