如何从twisted inlineCallbacks修饰函数捕获异常?

2024-10-06 12:20:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

@defer.inlineCallbacks
def read_input_status(self, address, length, callback):
    assert callback
    # ...

如果callbackNone,则抛出一个AssertionError,因此我试图查看它。。。函数的调用方式如下:

^{pr2}$

我在这里打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)。在


Tags: 对象函数代码nonereturnlibdef错误
1条回答
网友
1楼 · 发布于 2024-10-06 12:20:28

在重新阅读了docs about Twisted Deferred回调和错误返回之后,我发现了这个问题。上面和链接主旨中的代码的问题是缺少回调和errback的参数。如果我用下面的代码替换上面所写的代码,则会很好地捕捉到异常并按预期通过errback通知:

def cb(result):
    pass
def eb(failure):
    pass

相关问题 更多 >