2
我有以下代码:引发异常
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处理,添加后没有添加错误处理程序回调3,我期待'未处理的异常...'被抛出,但是这并没有发生。我在这里错过了什么吗?
请帮助 谢谢
感谢您的回复雕文。你是对的,这个例子在作为python脚本运行时会给出预期的输出。我从Python REPL运行它。为什么它不会在REPL中抛出未处理的错误? –
当'Deferred'在垃圾收集时仍处于失败状态时,会打印未处理的错误。如果用control-D退出解释器(或在Windows上输入control-Z),您将看到它打印出来。问题是,虽然你仍然有一个'd'的引用,你可能还会添加一个errback来处理错误,所以你可能会恢复。 – Glyph
我现在明白了,非常感谢:) –