python - 扭曲:如果回调出错,则没有异常跟踪

标签 python error-handling twisted deferred

考虑以下代码:

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

当它运行时,那个异常就被吃掉了。它去哪儿了?我怎样才能让它显示出来?执行 defer.setDebugging(True) 没有任何效果。

我问这个是因为其他时候,我得到一个打印输出,上面写着“Deferred 中未处理的错误:”。在这种情况下我怎样才能做到这一点?我看到如果我向 df 添加一个 errback,那么 errback 会被异常调用,但我只想打印错误而不做任何其他事情,我不想手动添加我创建的每个延迟的处理程序。

最佳答案

异常仍然存在于 Deferred 中。此时有两种可能的结果:

  • 您可以向 Deferred 添加一个 errback。一旦您这样做,它就会被调用,并带有包含引发的异常的失败。
  • 您可以让 Deferred 被垃圾回收(显式删除 df,或从函数返回,或以任何其他方式丢失引用)。这会触发“Deferred 中未处理的错误”代码。

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

通常,您希望确保在 Deferred 上有错误反馈,正是因为有时很难预测 Deferred 何时会被垃圾回收。这可能需要很长时间,这意味着如果您没有附加自己的 errback,则可能需要很长时间才能了解异常。

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

关于python - 扭曲:如果回调出错,则没有异常跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3826233/

相关文章:

python 扭曲: retrieve a deferred's execution time

python - 如何将文本对齐到 QTableWidget 中单元格的中心

python - 在 Pandas 中使用 PeriodIndex 与 DateTimeIndex ?

python - isinstance python返回不同的值

python - 数据迁移以替换文本字段中单词的实例?

javascript - Angular 2 RC5 及更高版本 - 当没有路由匹配时如何显示错误页面?

python - 扭曲的 python - tac 还是 py?

c# - 在.NET ASPX应用程序中使用ExecuteURL的自定义错误页面不起作用(重定向工作正常)

node.js - 提交表单时捕获Sails中的所有错误

python - 了解 Linux Mint 中的扭曲安装