在延迟回调中引发异常

Raising exceptions in Deferred callbacks

我有以下代码:

from twisted.internet.defer import Deferred

def callback1(result):
  print "callback1 called with ",result
  return result

def callback2(result):
  print "callback2 called with ",result

def callback3(result):
  raise Exception("callback 3")

def errback(result):
  print 'handled error'
  return 'everything fine now'

d = Deferred()
d.addCallback(callback1)
d.addCallback(callback2)
d.addCallbacks(callback3, errback)
d.callback("Test")

我希望输出为:

callback1 called with Test
callback2 called with Test
Unhandled Error
....

但我实际得到的是

callback1 called with Test
callback2 called with Test

由于回调链中 N 层引发的异常由 N+1 层的 errback 处理,并且在添加 callback3 后没有添加错误处理程序,我预计 'Unhandled exception...' 会被抛出,但是没有发生。我在这里遗漏了什么吗?

请帮忙 谢谢

运行 你的例子,我看到了你期望的输出:

callback1 called with  Test
callback2 called with  Test
Unhandled error in Deferred:


Traceback (most recent call last):
  File "t.py", line 21, in <module>
    d.callback("Test")
  File ".../twisted/internet/defer.py", line 393, in callback
    self._startRunCallbacks(result)
  File ".../twisted/internet/defer.py", line 501, in _startRunCallbacks
    self._runCallbacks()
--- <exception caught here> ---
  File ".../twisted/internet/defer.py", line 588, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "t.py", line 11, in callback3
    raise Exception("callback 3")
exceptions.Exception: callback 3

使用多个版本的 Twisted。你真的 运行 那个脚本原样吗?我假设您重新输入了输出,并且没有复制和粘贴它,因为您在 withTest 之间只有一个 space 而不是实际打印的两个。