考虑以下代码:

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

当它运行时,该异常就被吃掉了。去哪了如何显示它?进行defer.setDebugging(True)无效。

我之所以这样问,是因为其他时候,我得到一个打印输出,上面写着“Deferred中的未处理错误:”。在这种情况下,我该怎么办?我看到如果将errback添加到df中,则将调用errback并带有异常,但是我要做的就是打印错误并且不执行其他任何操作,并且我不想将该处理程序手动添加到我创建的每个延迟中。

最佳答案

异常(exception)仍然是在延期。此时有两种可能的结果:

  • 您可以将errback添加到Deferred。这样做后,将立即调用带有包含引发的异常的“失败”。
  • 您可以让Deferred进行垃圾回收(明确删除df,或者从函数中返回,或者以任何其他方式丢失引用)。这将触发“延后的未处理错误”代码。

  • 由于可以在任何时候(即,以上第一点)将errback添加到Deferred中,因此Deferred不会对未处理的错误立即执行任何操作。他们不知道该错误是真的还是直到现在才得以解决。只有在对Deferred进行垃圾回收时,才能确保没有其他人会处理该异常,因此才将其记录下来。

    通常,您要确保对Deferred有错误,正是因为有时很难预测Deferred何时会收集垃圾。这可能会很长一段时间,这意味着如果您没有自己的错误附加信息,则可能要花很长时间才能了解该异常。

    这不必是一个沉重的负担。从另一个Deferred(b)上的回调返回的任何Deferred(a)(即,发生链接时)会将其错误传递给b。因此(a)不需要额外的错误记录和报告,只有(b)才需要。如果您有一个复杂且涉及许多异步操作的逻辑任务,那么几乎总是有这样的情况,这些操作中涉及的所有Deferred都应将其结果(成功或失败)传递给代表该逻辑操作的一个主要Deferred。您通常只需要在该一个Deferred上执行特殊的错误处理行为,就可以处理来自其他所有Deferred的错误。

    关于python - 扭曲的: no exception trace if error from a callback,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3826233/

    10-12 18:46