twisted:如果调用出错,则无异常跟踪

2024-05-28 21:05:10 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码:

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

当它运行时,这个异常就会被吃掉。它去哪儿了?我怎样才能把它展示出来?做defer.setDebugging(True)没有效果。在

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


Tags: 代码true处理程序dfdefcallbackdeferraise
1条回答
网友
1楼 · 发布于 2024-05-28 21:05:10

例外情况仍在延期中。目前有两种可能的结果:

  • 你可以添加一个errback到延迟的。一旦您这样做,它将被调用,并包含引发的异常。在
  • 您可以让延迟的被垃圾回收(显式地删除df,或者从函数返回,或者以任何其他方式丢失引用)。这将触发“延迟的未处理错误”代码。在

因为errback可以随时添加到Deferred中(即上面的第一点),所以Deferreds不会立即对未处理的错误执行任何操作。他们不知道这个错误是真的没有处理,还是到目前为止还没有处理。只有当Deferred被垃圾回收时,它才能确定没有其他人会处理这个异常,所以它才会被记录下来。在

一般来说,您需要确保在延迟上存在错误,这正是因为有时很难预测延迟的对象何时会被垃圾回收。这可能需要很长时间,也就是说,如果没有附加自己的errback,则可能需要很长时间才能了解异常。在

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

相关问题 更多 >

    热门问题