2015-10-15 158 views
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,我期待'未处理的异常...'被抛出,但是这并没有发生。我在这里错过了什么吗?

请帮助 谢谢

回答

3

运行你的榜样,我看到了你的输出预计:

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 

与扭曲的多个版本。你是否真的按原样运行了这个确切的脚本?我假设你重新输入了输出,并没有复制和粘贴,因为你只有一个空间在withTest之间,而不是实际打印的两个空间。

+1

感谢您的回复雕文。你是对的,这个例子在作为python脚本运行时会给出预期的输出。我从Python REPL运行它。为什么它不会在REPL中抛出未处理的错误? –

+1

当'Deferred'在垃圾收集时仍处于失败状态时,会打印未处理的错误。如果用control-D退出解释器(或在Windows上输入control-Z),您将看到它打印出来。问题是,虽然你仍然有一个'd'的引用,你可能还会添加一个errback来处理错误,所以你可能会恢复。 – Glyph

+0

我现在明白了,非常感谢:) –