gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 16:39:58 25 4
gpt4 key购买 nike

我开始使用 twisted 作为我将要使用的库之一依赖于它。在早期测试中,我对如何捕获在这样的函数中抛出的异常感到困惑:

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

如果 callbackNone 一个 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' 时这是不可能的。但是我的 errback 从未被调用过。

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

def _inlineCallbacks(result, g, deferred):
# ...
while 1:
try:
# ...
result = g.send(result)
except:
deferred.errback()
return deferred

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

def unwindGenerator(*args, **kwargs):
# ...
return _inlineCallbacks(None, gen, Deferred())

我是不是弄错了,或者这只是一个新对象,空的,简单的,没有附加回调/错误反馈?

很抱歉这么长的阐述。找不到任何直接相关的内容,除了 this SO post我无法直接看到它如何解决我的问题。

非常感谢。

[更新] 请看这个gist用于工作示例代码(Python 2.7.6,Twisted 13.2.0)。

最佳答案

在重读 docs about Twisted Deferred 后想通了回调和错误反馈。上面的代码和链接的要点中的问题是缺少回调和 errback 的参数。如果我用以下代码替换上面写的内容,异常会被正常捕获并按预期通过 errback 通知:

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

关于python - 如何从扭曲的 inlineCallbacks 修饰函数中捕获异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com