twisted:如果来自回调的错误,则无异常跟踪

Cla*_*diu 2 python error-handling twisted deferred

请考虑以下代码:

df = defer.Deferred()
def hah(_): raise ValueError("4")
df.addCallback(hah)
df.callback(hah)
Run Code Online (Sandbox Code Playgroud)

当它运行时,该异常就会被吃掉.它去了哪里?如何才能显示它?做defer.setDebugging(True)没有效果.

我问这个是因为其他时候,我得到一个打印输出"延迟时未处理的错误:".在这种情况下如何实现?我看到如果我添加一个errback df然后errback被异常调用,但我想要做的就是打印错误而不做任何其他事情,我不想手动将该处理程序添加到我创建的每个延迟.

Jea*_*one 6

例外仍然在延期.此时有两种可能的结果:

  • 您可以向延迟添加错误.一旦你这样做,它将被调用一个包含引发的异常的失败.
  • 你可以让递延被垃圾收集(显式删除df,或从函数返回,或者失去以任何其他方式参考).这会触发"延迟的未处理错误"代码.

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

一般来说,您希望确保在Deferreds上有错误,因为有时很难预测Deferred何时会收集垃圾.这可能需要很长时间,这意味着如果您没有附加自己的错误,可能需要很长时间才能了解异常.

这不一定是一个可怕的负担.从另一个Deferred(b)的回调中返回的任何Deferred(a)(即,当链接发生时)将其错误传递给b.所以(a)对于日志记录和报告不需要额外的错误,只有(b)可以.如果您有一个复杂且涉及许多异步操作的逻辑任务,那么这些操作中涉及的所有Deferred几乎总是应该将其结果(成功或失败)引导到表示逻辑操作的一个主Deferred.您通常只需要在Deferred上执行特殊的错误处理行为,这将允许您处理来自任何其他相关延迟的错误.