Python Deferred.callback()或Deferred.errback()能否向调用方引发异常?

Python Deferred.callback()或Deferred.errback()能否向调用方引发异常?,python,twisted,twisted.internet,Python,Twisted,Twisted.internet,调用.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_callba

调用
.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
中的结果将是
错误回调()中的
异常。如果调用
d.errback(Exception())
,则
d
中的结果将是从
bad\u errback()引发的
异常。但是,在这两种情况下,都不会向调用方提出异常

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

  • 显然,如果调用
    .callback()
    .errback()
    的参数数量不正确,则会引发
    类型错误

  • 调用已调用的延迟将引发
    AlreadyCalledError

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

  • 调用
    .errback()
    相当于调用
    .errback(failure.failure())
    ,如果没有活动异常,这将引发
    NoCurrentExceptionError


实际上,我的问题可以归结为:我可以安全地依赖于调用
.callback(result)
.errback(exception\u或\u 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!
延迟中未处理的错误: 未处理错误 回溯(最近一次呼叫最后一次): 文件“callbacks.py”,第11行,在 d、 回调(无) 回调中第368行的文件“../twisted/internet/defer.py” 自启动返回(结果) 文件“../twisted/internet/defer.py”,第464行,在startRunCallbacks中 self.\u runCallbacks() --- --- 文件“../twisted/internet/defer.py”,第551行,在_runCallbacks中 current.result=回调(current.result,*args,**kw) 文件“callbacks.py”,第4行,在bad_回调中 引发异常() 例外。例外: 好啊
因此,在这个特定的情况下(正如您自己确定的),不,不会重新引发异常

在一般情况下,有几个地方例外会有效地传播出去;如果由于内存不足而出现
MemoryError
,则
Deferred
实现本身可能会通过尝试调用函数或其他东西在某处分配一点内存,而该异常将返回给您

但这只是用Python编程的一般风险;有几种例外情况(
内存错误
键盘中断
)可能在没有警告的情况下出现。如果您的整个过程没有被烧毁,那么除您概述的情况外,
callback
errback
不会引发异常