gpt4 book ai didi

python - 如何捕获源自 reactor.stop() 的 Deferred 中未处理的错误

转载 作者:行者123 更新时间:2023-11-28 22:49:43 24 4
gpt4 key购买 nike

我是 twisted 的新手,在使用以下脚本时遇到了问题。

当我运行以下命令时:

#!/usr/bin/env python
from twisted.internet import defer
from twisted.web.client import getPage, reactor

def success(results):
print 'success'

def error(results):
print 'error'
return results

def finished(results):
print 'finished'
reactor.stop()

tasks = []

d = getPage('thiswontwork').addCallback(success).addErrback(error)
tasks.append(d)

dl = defer.DeferredList(tasks)
dl.addCallback(finished)

reactor.run()

我得到以下输出:

error
finished
Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
Failure: twisted.internet.error.ConnectionRefusedError: Connection was refused by other side: 61: Connection refused.

我的问题是,为什么我似乎已经通过错误回调捕捉到了错误,却收到了未处理的错误?

最佳答案

问题是在你的 error def 中你返回了 result ,假设它被错误调用返回是一个 Failure 对象,返回一个 Failure 对象是重新引发错误状态的两个标准之一。请参阅 krondo's twisted intro - part 9 中的以下简介:

Now, in synchronous code we can “re-raise” an exception using the raise keyword without any arguments. Doing so raises the original exception we were handling and allows us to take some action on an error without completely handling it. It turns out we can do the same thing in an errback. A deferred will consider a callback/errback to have failed if:

  • The callback/errback raises any kind of exception, or
  • The callback/errback returns a Failure object.

Since an errback’s first argument is always a Failure, an errback can “re-raise” the exception by returning its first argument, after performing whatever action it wants to take.

是的,刚刚试过了,如果你改变了:

def error(results):
print 'error'
return results

def error(results):
print 'error'
return

您不会重新引发错误状态,因此它不会渗透回 react 器,也不会导致让您烦恼的回溯。

附言我不能推荐krondo's twisted introduction足够的!它可能真的很长,但如果你能通过它,你真的可以生成扭曲的代码,并且这些行为将不再是一个谜。

P.P.S 我看到您之前有关于延迟的 SO 问题(Python DeferredList callback reporting success when deferreds raise error),这可能是您以这种方式构建代码的原因。我认为您可能对 def 中涉及的 deferred(尤其是 errback)的返回值/回调值存在根本性的误解。查看part 9 (尽管您可能需要备份 part 7 或更早的时间来跟踪它)krondo 的,它确实应该有助于清理问题。

关于python - 如何捕获源自 reactor.stop() 的 Deferred 中未处理的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23450952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com