首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Deferred.callback()或Deferred.errback()可以向调用方引发异常吗?

Deferred.callback()或Deferred.errback()可以向调用方引发异常吗?
EN

Stack Overflow用户
提问于 2014-03-11 15:05:35
回答 1查看 574关注 0票数 1

在调用.callback().errback()不会被延迟的调用者捕获的情况下,会出现这样的情况吗?

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

代码语言:javascript
复制
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)永远不会引发异常,只要延迟的调用尚未被调用,并且结果是正确的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-11 18:49:53

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

代码语言:javascript
复制
d.callback(None)
print("OK!")

得到了这个输出:

代码语言:javascript
复制
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)可能会在没有警告的情况下出现。如果您的整个过程没有烧毁,那么no、callbackerrback将不会引发异常,除非您已经概述了这些情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22329637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档