我开始使用twisted,因为我将使用的lib之一取决于它。在早期测试中,我对如何捕捉函数中抛出的异常感到困惑:
@defer.inlineCallbacks
def read_input_status(self, address, length, callback):
assert callback
# ...
如果callback
是None
,则抛出一个AssertionError
,因此我试图查看它。。。函数的调用方式如下:
我在这里打deferLater
是为了能够处理错误,因为我知道在使用“callLater”时这是不可能的。但我的错误永远不会被召唤。在
奇怪的是,在尝试调试和查看twisted lib的代码时,我想我已经看到了一个原因,为什么我的errback没有效果。我的修饰生成器函数(下面的参数g
)由twisted的defer._inlineCallbacks
实现调用,如下所示(breviated):
def _inlineCallbacks(result, g, deferred):
# ...
while 1:
try:
# ...
result = g.send(result)
except:
deferred.errback()
return deferred
我确实在最后一节中看到我的异常弹出,在那里调用了deferred的errback。但是:这不是我推迟的。。。如果我在调试器的调用层次结构中向上移动一个调用,我会看到哪个延迟对象实际传递给_inlineCallbacks
:
def unwindGenerator(*args, **kwargs):
# ...
return _inlineCallbacks(None, gen, Deferred())
我是不是搞错了,或者这只是一个新对象,空的,普通的,没有附加回调/错误的对象?在
很抱歉,这冗长的阐述。找不到任何直接相关的内容,除了this SO post之外,我无法直接看到它是如何解决我的问题的。在
非常感谢。在
[UPDATE]请参阅这个gist以获取工作示例代码(python2.7.6,Twisted 13.2.0)。在
在重新阅读了docs about Twisted Deferred回调和错误返回之后,我发现了这个问题。上面和链接主旨中的代码的问题是缺少回调和errback的参数。如果我用下面的代码替换上面所写的代码,则会很好地捕捉到异常并按预期通过errback通知:
相关问题 更多 >
编程相关推荐