Python 如何在gevent中捕获回溯

Python 如何在gevent中捕获回溯,python,exception-handling,gevent,greenlets,Python,Exception Handling,Gevent,Greenlets,我已经生成了一个Greenlet并将其链接到一个可调用的。一段时间后,Greenlet出现了一个例外。调用链接的可调用对象。太好了 问题是: 如您所料,异常的回溯将出现在我的控制台上。但我想在链接的callable中使用该回溯来做一些事情。如何在链接的callable中访问该回溯 (我的第一反应是使用traceback.extract_stack(),但它为链接的可调用对象本身而不是异常提供了回溯。)Greenlet对象应该有一个异常属性,您可以查看: 只要确保抓取Greenlet的异常值并将其

我已经生成了一个Greenlet并将其链接到一个可调用的。一段时间后,Greenlet出现了一个例外。调用链接的可调用对象。太好了

问题是:

如您所料,异常的回溯将出现在我的控制台上。但我想在链接的callable中使用该回溯来做一些事情。如何在链接的callable中访问该回溯


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

Greenlet对象应该有一个
异常
属性,您可以查看:


只要确保抓取Greenlet的
异常值
并将其抛出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

应该给你你所需要的。

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


如果要保存回溯,必须自己保存。

作为Stephen Diehl解决方案的替代方案,使用
Greenlet.link\u exception

导入回溯
导入gevent
定义作业():
引发异常('ooops')
def on_异常(绿色):
尝试:
greenlet.get()
除例外情况外:
err=traceback.format_exc()
#用“错误”做某事`
g=gevent.spawn(作业)
g、 链接异常(打开异常)

如何从中获取回溯?我正在尝试在链接的可调用函数中获取回溯(例如,foo=gevent.Greenlet(x);foo.link\u exception(bar);foo.start();也许你应该把你的代码粘贴到上面,你的问题似乎是一个范围问题,如果我们能看到你是如何设置你的范围的,那么调试就会更容易。这是一个权威性的答案。谢谢,丹尼斯。你会先生成链接,而不是创建、链接和启动?有什么实际的区别吗?这是否解决了这个问题我在对Diehl的解决方案的评论中提出了rns?理论上,我猜greenlet可能会在以这种方式创建链接之前崩溃。进行了一些测试,它似乎没有真正解决您的问题。但是它得到了整个stacktrace,但它也只包含一些额外的引用(如greenlet.get())。