在调用.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。AlreadyCalledError。.callback(defer.Deferred())将引发AssertionError。.errback()等同于调用.errback(failure.Failure()),这将在没有活动异常的情况下引发NoCurrentExceptionError。实际上,我的问题是:我能否安全地依赖于这样一种行为,即使用结果调用.callback(result)或.errback(exception_or_failure)永远不会引发异常,只要延迟的调用尚未被调用,并且结果是正确的。
发布于 2014-03-11 18:49:53
我运行了您的示例,在底部添加了两行:
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编程的一个风险;有几个例外(MemoryError、KeyboardInterrupt)可能会在没有警告的情况下出现。如果您的整个过程没有烧毁,那么no、callback和errback将不会引发异常,除非您已经概述了这些情况。
https://stackoverflow.com/questions/22329637
复制相似问题