请考虑以下代码:
df = defer.Deferred()
def hah(_): raise ValueError("4")
df.addCallback(hah)
df.callback(hah)
当它运行时,该异常就会被吃掉。它去了哪里?如何才能显示它?执行defer.setDebugging(True)
无效。
我问这个是因为其他时候,我得到一个打印输出,说“延迟中的未处理错误:”。在这种情况下如何实现?我看到如果我向df
添加一个errback,那么errback会被异常调用,但我想要做的就是打印错误而不做任何其他事情,我不想手动添加该处理程序我创造的每一个延期。
答案 0 :(得分:6)
例外仍然在延期中。此时有两种可能的结果:
df
,或从函数返回,或以任何其他方式丢失引用)。这会触发“延迟的未处理错误”代码。因为Errback可以随时添加到Deferred(即上面的第一点),Deferreds不会立即对其他未处理的错误做任何事情。他们不知道错误是否真的未处理,或者到目前为止尚未处理。只有当Deferred被垃圾收集时,才能确定没有其他人会处理异常,所以当它被记录时。
一般情况下,您希望确定Deferreds上有错误,因为有时很难预测Deferred何时会收集垃圾。这可能需要很长时间,这意味着如果您没有附加自己的错误,可能需要很长时间才能了解异常。
这不一定是一个可怕的负担。从另一个Deferred(b)的回调中返回的任何Deferred(a)(即,当链接发生时)将其错误传递给b。所以(a)对于日志记录和报告不需要额外的错误,只有(b)可以。如果您有一个复杂且涉及许多异步操作的逻辑任务,那么这些操作中涉及的所有Deferred几乎总是应该将其结果(成功或失败)引导到表示逻辑操作的一个主Deferred。您通常只需要在那个Deferred上执行特殊的错误处理行为,这将允许您处理来自任何其他相关延迟的错误。