如何在gevent中捕获回溯



我生成了一个Greenlet,并将其链接到一个可调用的。一段时间后,Greenlet出现异常而失败。链接的可调用函数被调用。太棒了!

问题是:

正如您所期望的,Exception的回溯显示在我的控制台上。但我想在链接的可调用函数中使用该回溯。如何在链接的可调用函数中访问该回溯?

(我的第一反应是使用traceback.extract_stack(),但事实证明,它为链接的可调用对象本身而不是异常提供了回溯。)

当Greenlet死亡时,有意不保存回溯。如果保存了它,它将使许多预期要删除的对象保持活动状态,这在对象管理某些资源(打开的文件或套接字)时尤其重要。

如果你想保存回溯,你必须自己做。

作为Stephen Diehl使用Greenlet.link_exception的解决方案的替代方案。

import traceback
import gevent
def job():
    raise Exception('ooops')
def on_exception(greenlet):
    try:
        greenlet.get()
    except Exception:
        err = traceback.format_exc()
        # Do something with `err`
g = gevent.spawn(job)
g.link_exception(on_exception)

Greenlet对象应该有一个可以查看的exception属性:

http://www.gevent.org/gevent.html#gevent.Greenlet.exception

只需确保获取Greenlet的exception值并将其抛出Greenlet之外,例如get返回返回的值或引发内部异常。

import traceback
import gevent
def fail():
    return 0/0
gl = gevent.spawn(fail)
try:
    gl.get()
except Exception as e:
    stack_trace = traceback.format_exc() # here's your stacktrace

应该给你你需要的。

相关内容

  • 没有找到相关文章

最新更新