6

我生成了一个 Greenlet 并将其链接到一个可调用对象。一段时间后,Greenlet 因异常而失败。链接的可调用对象被调用。这一切都很棒!

这是问题:

如您所料,异常的回溯出现在我的控制台上。但我想在链接的可调用文件中使用该回溯来做事。如何在链接的可调用文件中访问该回溯?

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

4

4 回答 4

17

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

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

于 2012-02-14T07:44:37.487 回答
2

作为 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)
于 2016-10-11T13:06:49.317 回答
1

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

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

于 2012-02-13T22:24:21.263 回答
1

只需确保您获取exceptionGreenlet 的值并将其扔到 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

应该给你你需要的。

于 2012-02-13T22:38:33.570 回答