如何从扭曲的 inlineCallbacks 装饰函数中捕获异常?

mik*_*kep 5 python twisted generator

我开始使用扭曲,因为我将使用的库之一取决于它。在早期的测试中,我对如何捕获在这样的函数中抛出的异常感到困惑:

@defer.inlineCallbacks
def read_input_status(self, address, length, callback):
    assert callback
    # ...
Run Code Online (Sandbox Code Playgroud)

If callbackis Nonean is an AssertionErroris throw, so I try to see it... 该函数是这样调用的:

def cb():
    pass
def eb():
    pass

d = task.deferLater(reactor, 1, client.read_input_status, 0x0000, 8, None)
d.addCallback(cb)
d.addErrback(eb)
Run Code Online (Sandbox Code Playgroud)

我是deferLater故意打电话到这里来处理错误的,因为我知道在使用 `callLater' 时这是不可能的。但我的 errback 从来没有被调用过。

奇怪的是,在尝试调试和查看扭曲库的代码时,我想我已经看到了一个原因,为什么我的 errback 没有效果。我的装饰生成器函数(g下面的参数)由扭曲的defer._inlineCallbacks实现调用,如下所示(缩写):

def _inlineCallbacks(result, g, deferred):
    # ...
    while 1:
        try:
            # ...
            result = g.send(result)
        except:
            deferred.errback()
            return deferred
Run Code Online (Sandbox Code Playgroud)

我确实在最后一节中看到了我的异常弹出,然后调用了延迟的 errback。但是:这不是我的延迟......如果我在调试器的调用层次结构中调用一个调用,我会看到实际传递给哪个延迟对象_inlineCallbacks

def unwindGenerator(*args, **kwargs):
    # ...
    return _inlineCallbacks(None, gen, Deferred())
Run Code Online (Sandbox Code Playgroud)

我错了还是这只是一个新对象,空的,普通的,没有附加回调/错误返回?

抱歉,冗长的阐述。找不到任何直接相关的东西,除了这篇 SO 帖子,我无法直接看到它如何解决我的问题。

非常感谢。

[更新]有关工作示例代码(Python 2.7.6,Twisted 13.2.0),请参阅此要点

mik*_*kep 3

在重新阅读有关 Twisted Deferred 回调和 errbacks 的文档后发现了这一点。上面的代码和链接的要点中的问题是缺少回调和错误返回的参数。如果我用以下代码替换上面编写的内容,则可以很好地捕获异常并按预期通过 errback 通知:

def cb(result):
    pass
def eb(failure):
    pass
Run Code Online (Sandbox Code Playgroud)