gpt4 book ai didi

python - Deferred.callback() 或 Deferred.errback() 是否可以向调用者引发异常?

转载 作者:行者123 更新时间:2023-12-01 05:21:12 26 4
gpt4 key购买 nike

是否存在这样的情况:调用 .callback().errback() 会向调用者引发异常,而该异常不会被延迟捕获?

假设我有以下延迟和回调:

from twisted.internet import defer

def bad_callback(result):
raise Exception()

def bad_errback(result):
raise Exception()

d = defer.Deferred()
d.addCallbacks(bad_callback, bad_errback)

如果我调用d.callback(None)d中的结果将是来自bad_callback()<的Exception/。如果我调用 d.errback(Exception())d 中的结果将是从 bad_errback()< 引发的 Exception/。但是,在这两种情况下,都不会向调用者引发异常。

现在,我确实知道调用 .callback().errback() 会向调用者引发异常的几个条件,但这些条件是你违反了延迟的正确使用。

  • 显然,如果您使用不正确数量的参数调用 .callback().errback(),则会引发 TypeError.

  • 调用已调用的 deferred 将引发 AlreadyCalledError

  • 调用 .callback(defer.Deferred()) 将引发 AssertionError

  • 调用 .errback() 相当于调用 .errback(failure.Failure()),如果满足以下条件,则会引发 NoCurrentExceptionError没有事件的异常。

我的问题实际上归结为:我是否可以安全地依赖调用 .callback(result).errback(exception_or_failure) 且结果永远不会引发的行为只要 deferred 尚未被调用且结果正确,就会出现异常吗?

最佳答案

我运行了您的示例,在底部添加了两行:

d.callback(None)
print("OK!")

并得到这个输出:

Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
File "callbacks.py", line 11, in <module>
d.callback(None)
File ".../twisted/internet/defer.py", line 368, in callback
self._startRunCallbacks(result)
File ".../twisted/internet/defer.py", line 464, in _startRunCallbacks
self._runCallbacks()
--- <exception caught here> ---
File ".../twisted/internet/defer.py", line 551, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "callbacks.py", line 4, in bad_callback
raise Exception()
exceptions.Exception:
OK!

因此,在这种特定情况下(正如您自己确定的那样),不会,不会重新引发异常。

在一般情况下,有一些地方会有效地传播异常;如果您因为内存完全耗尽而出现 MemoryError ,则很可能 Deferred 实现本身会通过尝试调用函数或其他内容来在某处分配一点内存,然后异常将会返回给你。

但这只是 Python 编程的一般风险;有几个异常(MemoryErrorKeyboardInterrupt)可能会在没有警告的情况下出现。如果您的整个流程没有崩溃,那么除您概述的情况外,callbackerrback 不会引发异常。

关于python - Deferred.callback() 或 Deferred.errback() 是否可以向调用者引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22329637/

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