【问题标题】:Handling Failure in Twisted处理 Twisted 中的失败
【发布时间】:2012-07-09 08:05:27
【问题描述】:

这是我的一些 api 的简单 HTTP 客户端:

# -*- coding: utf-8 -*-
import settings
from twisted.internet import reactor
from twisted.web.client import Agent
from twisted.web.http_headers import Headers

params = {
    'url': 'http://api.vk.com/api.php',
    'id':260,
    }


def params_for_get():
    return '&'.join(["%s=%s" % (key,val) for key, val in params.items()])


agent = Agent(reactor)
d = agent.request(
    'GET',
    "%s?%s" % (settings.APPLICATION_URL, params_for_get()),
    Headers({'User-Agent': ['Twisted Web Client Example'],
             'Content-Type': ['text/x-greeting']}),
    '')

def cbResponse(*args, **kwargs):
    print args, kwargs
    print 'Response received'


def cbShutdown(ignored):
    reactor.stop()

def cbError(failure):
    print type(failure.value), failure # catch error here


d.addCallbacks(cbResponse, cbError)
d.addBoth(cbShutdown)


reactor.run()

当我启动程序时,我发现错误:

<class 'twisted.web._newclient.RequestGenerationFailed'> [Failure instance: Traceback (failure with no frames): <class 'twisted.web._newclient.RequestGenerationFailed'>: [<twisted.python.failure.Failure <type 'exceptions.AttributeError'>>]
]

但我不知道,这个错误发生在哪里。 我怎么知道? 我试图显示

的回溯
<twisted.python.failure.Failure <type 'exceptions.AttributeError'>>

但我无法得到。

【问题讨论】:

  • 您可能想在失败实例上尝试“getErrorMessage()”,看看它是否提供了更多信息。
  • 您在此处收到如此糟糕的错误消息的事实是 Twisted 中的一个错误。见twistedmatrix.com/trac/ticket/5310

标签: python twisted


【解决方案1】:

那个Failure 实例正在包装另一个Failure 实例,并且没有打印关于里面那个的太多信息。这种尴尬是 Twisted 的错。 twisted.web._newclient._WrapperException 类存储了一个 reasons 属性,但似乎并不关心在其 __str__ 方法中打印有关这些原因的信息。

如果您在 cbError() 函数中添加另一行,您可能会看到问题的其余部分:

failure.value.reasons[0].printTraceback()

我可以在这里重现该错误,并且通过额外的信息很明显,Agent.request() 的第四个参数应该是IBodyProducer 提供程序,但您传递的是一个空字符串。尝试删除最后一个参数。

【讨论】:

  • 谢谢。真的很有帮助:)
【解决方案2】:

上面-paul 的回答是正确的。我想提供这个简短的函数,我发现它对消除失败很有用,但我无法将它放在评论中:

def unwrap_failures(err):
    """
    Takes nested failures and flattens the nodes into a list.
    The branches are discarded.
    """
    errs = []
    check_unwrap = [err]
    while len(check_unwrap) > 0:
        err = check_unwrap.pop()
        if hasattr(err.value, 'reasons'):
            errs.extend(err.value.reasons)
            check_unwrap.extend(err.value.reasons)
        else:
            errs.append(err)
    return errs

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 2023-01-06
    • 2016-06-30
    • 2014-06-24
    • 1970-01-01
    • 2011-07-15
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多