我要开始使用Twisted了,因为我将要使用的库之一取决于它。在早期的测试中,我对如何捕获在这样的函数中引发的异常感到困惑:
@defer.inlineCallbacks
def read_input_status(self, address, length, callback):
assert callback
# ...
如果
callback
是None
,则会抛出AssertionError
,所以我尝试查看它...函数的调用方式如下:def cb():
pass
def eb():
pass
d = task.deferLater(reactor, 1, client.read_input_status, 0x0000, 8, None)
d.addCallback(cb)
d.addErrback(eb)
我在这里调用
deferLater
是为了能够处理错误,因为我知道在使用`callLater'时这是不可能的。但是我的错误永远不会被调用。奇怪的是,当尝试调试并查看扭曲的lib的代码时,我认为我已经看到了一个原因,为什么我的errback无效。我的修饰的生成器函数(下面的参数
g
)由twisted的defer._inlineCallbacks
实现调用,如下所示(简称):def _inlineCallbacks(result, g, deferred):
# ...
while 1:
try:
# ...
result = g.send(result)
except:
deferred.errback()
return deferred
我确实在上一节中看到了我的异常弹出,然后在其中调用了延迟的错误。但是:那不是我延迟的...如果我在调试器的调用层次结构中进行一个调用,我会看到哪个延迟对象实际上传递给了
_inlineCallbacks
:def unwindGenerator(*args, **kwargs):
# ...
return _inlineCallbacks(None, gen, Deferred())
我是不是弄错了,或者这仅仅是一个空的,纯净的,没有回调/错误附加的新对象?
很抱歉,冗长的阐述。除了this SO post之外,找不到与之直接相关的任何内容,在gist上我无法直接看到它如何解决我的问题。
非常感谢。
[更新]请查看此ojit_a以获取有效的示例代码(Python 2.7.6,Twisted 13.2.0)。
最佳答案
在重新读取docs about Twisted Deferred回调和errbacks之后解决了该问题。上面的代码以及链接的要点中的问题是缺少用于callback和errback的参数。如果我用以下代码替换上面写的内容,则异常会很好地捕获,并按预期通过errback通知:
def cb(result):
pass
def eb(failure):
pass