处理扭曲中的失败

use*_*311 9 python twisted

对于某些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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

<twisted.python.failure.Failure <type 'exceptions.AttributeError'>>
Run Code Online (Sandbox Code Playgroud)

但我无法得到.

the*_*aul 7

该Failure实例正在包装另一个Failure实例,并且没有打印有关内部实例的大量信息.这种尴尬是扭曲的错; 在twisted.web._newclient._WrapperException类存储reasons属性,但似乎并没有在意打印约在这些原因的信息__str__的方法.

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

failure.value.reasons[0].printTraceback()
Run Code Online (Sandbox Code Playgroud)

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