如何在gevent中捕获回溯

时间:2012-02-13 22:21:40

标签: python exception-handling gevent greenlets

我已经产生了一个Greenlet并将其链接到一个可调用的。一段时间后,Greenlet因异常而失败。链接的callable被调用。那太好了!

问题在于:

Exception的回溯显示在我的控制台上,正如您所期望的那样。但我想在链接的callable中使用该回溯做一些事情。如何在链接的可调用对象中访问该回溯?

(我的第一直觉是使用traceback.extract_stack(),但事实证明它为链接的callable本身而不是Exception提供了追溯。)

4 个答案:

答案 0 :(得分:16)

当Greenlet死亡时,故意不保存回溯。如果它被保存了,它会保留许多预期会被删除的对象,这对象特别重要,如果对象管理一些资源(打开文件或套接字)。

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

答案 1 :(得分:1)

Greenlet对象应具有exception属性,您可以查看:

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

答案 2 :(得分:1)

只需确保获取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

应该给你你需要的东西。

答案 3 :(得分:1)

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

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)