Python 在延迟回调中引发异常

Python 在延迟回调中引发异常,python,twisted,Python,Twisted,我有以下代码: 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"

我有以下代码:

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后没有添加错误处理程序,因此我希望抛出“未处理的异常…”,但这不会发生。我是不是遗漏了什么

请帮忙
感谢您运行您的示例,我看到了您期望的输出:

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
callback1用Test调用
用Test调用callback2
延迟中未处理的错误:
回溯(最近一次呼叫最后一次):
文件“t.py”,第21行,在
d、 回调(“测试”)
回调中第393行的文件“../twisted/internet/defer.py”
自启动返回(结果)
文件“../twisted/internet/defer.py”,第501行,在startRunCallbacks中
self.\u runCallbacks()
---  ---
文件“../twisted/internet/defer.py”,第588行,在运行回调中
current.result=回调(current.result,*args,**kw)
回调3中第11行的文件“t.py”
引发异常(“回调3”)
异常。异常:回调3

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

感谢回复图示符。您是对的,当作为python脚本运行时,该示例确实给出了预期的输出。我是从Python REPL运行它的。为什么它不在REPL中抛出未处理的错误?当
延迟的
仍处于失败状态时进行垃圾收集时,会打印未处理的错误。如果您使用control-D(或Windows上的control-Z enter)退出解释器,您将看到它被打印出来。问题是,虽然您仍然有对
d
的引用,但仍然可能添加一个errback来处理错误,因此您可能会恢复。