对于某些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'>>
但我无法得到。
答案 0 :(得分:7)
该Failure实例正在包装另一个Failure实例,并且没有打印有关内部实例的大量信息。这种尴尬是扭曲的错; twisted.web._newclient._WrapperException
类存储reasons
属性,但似乎并不关心在__str__
方法中打印有关这些原因的信息。
如果在cbError()函数中添加另一行,则可以看到问题的其余部分:
failure.value.reasons[0].printTraceback()
我可以在这里重现错误,并且有了额外的信息,显然你的Agent.request()
的第四个参数应该是IBodyProducer
提供者,但是你传递的是一个空字符串。尝试删除最后一个参数。
答案 1 :(得分:2)
以上保罗的回答是正确的。我想提供这个简短的功能,我发现这个功能可以用来平坦化故障,但我无法将其写入评论中:
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