2010-09-29 19 views
2

错误请看下面的代码:扭曲:无异常跟踪,如果从回调

df = defer.Deferred() 
def hah(_): raise ValueError("4") 
df.addCallback(hah) 
df.callback(hah) 

当它运行时,该异常只是获取吃掉。它去了哪里?我怎样才能让它显示?做defer.setDebugging(True)没有效果。

我问这个,因为其他时间,我得到一个打印输出说“未处理的延迟的错误:”。我如何在这种情况下发生?我发现如果我添加一个errback到df那么errback会被异常调用,但是我想要做的就是打印错误,不做任何其他事情,而且我不想手动将该处理程序添加到每个延迟我创建。

+0

你正在使用哪种扭曲版本? – 2010-09-30 07:30:32

+0

@Jacob:8.1.0由于最小注释大小限制而添加了其他无关字符 – Claudiu 2010-09-30 15:50:48

回答

5

该例外仍然在延期。在这一点上有两种可能的结果:

  • 您可以将一个errback添加到延迟。只要你这样做,它会被调用,包含引发异常的失败。
  • 你可以让Deferred被垃圾收集(显式删除df,或者从函数返回,或者以任何其他方式丢失引用)。这会触发'Deferred'中的'未处理的错误'代码。

因为errback可以随时添加到Deferred(即上面的第一个点),所以Deferreds不会对其他未处理的错误做任何处理。他们不知道错误是否真的没有处理,或者到目前为止尚未处理。只有当Deferred被垃圾收集时,它才能确定没有其他人会处理这个异常,所以当它被记录时。

一般而言,您希望确定您在延迟方面有错误,正是因为有时很难预测延迟何时会收集垃圾。这可能需要很长时间,这意味着如果您没有附加自己的errback,您可能需要很长时间才能了解该例外情况。

这并不一定是一个可怕的负担。从另一个延期(b)(即发生链接时)的回调中返回的任何Deferred(a)将会将其错误传递给b。所以(a)在记录和报告时不需要额外的错误,只有(b)确实如此。如果您有一项复杂且涉及许多异步操作的逻辑任务,那么涉及这些操作的所有延迟应将其结果(成功或失败)引导至代表逻辑操作的一个主Deferred。您经常只需要在该Deferred上执行特殊的错误处理行为,并且可以让您处理任何其他涉及的Deferred错误。