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
不会引发异常