考虑下列代码:

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

它运行时,这一例外只是被吃掉。在哪里去了?我如何可以获得它显示?做 defer.setDebugging(True) 没有任何影响。

我问这个是因为其他时间,我的打印输出,说"未处理的错误在推迟:".我怎么得到这样的事情发生在这种情况下?我看到,如果我补充一errback到 df 然后errback被称为与例外,但是所有我想做的只是打印错误及没有别的,我不想到手工加入,处理程序每一个推迟我创造。

有帮助吗?

解决方案

唯一的例外是仍然坐在推迟。有两种可能的结果在这一点:

  • 你可以添加一个errback的推迟。尽快这样做,它将获得称为一个失败含有异常升高。
  • 你可以让的推迟是垃圾收集(明确删除 df, 或返回自的功能,或者失去了参考的任何其他方式)。这触发的"未处理的错误中推迟"的代码。

因为一个errback可以加入一个推迟在任何时间(即,第一点所述),延迟不做任何事情,否则未经处理的错误。他们不知道如果错误是真正的未处理,或只是未经处理的这么远。只有当延迟的是垃圾收集,这可以确保没有人会来处理异常,所以它得到记录。

在一般情况下,你想要可以肯定你有errbacks上的延迟,正是因为它有时很难预测何时延期会得到垃圾收集。它可能是一个漫长的时间,这意味着它可能是一个漫长的时间之前了解有关异常的,如果你没有自己的errback连接。

这并不是一个可怕的负担。任何推迟(a)其返回在另一种推迟(b)(即,当链接发生)将通过其错误给b。所以(a)不需要额外的errbacks在它的记录和报告,只有(b)。如果你有一个单一的逻辑的任务是复杂的,涉及许多步行动,这几乎总是这种情况下,所有延迟参与这些行动应该通道他们的结果(成功或失败)的一个主要的延期,表示逻辑操作。你往往只需要特殊处理错误行为这一推迟,而这会让你处理错误的任何其他延迟的参与。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top