我已经产生了一个Greenlet并将其链接到一个可调用的。一段时间后,Greenlet因异常而失败。链接的callable被调用。那太好了!
问题在于:
Exception的回溯显示在我的控制台上,正如您所期望的那样。但我想在链接的callable中使用该回溯做一些事情。如何在链接的可调用对象中访问该回溯?
(我的第一直觉是使用traceback.extract_stack()
,但事实证明它为链接的callable本身而不是Exception提供了追溯。)
答案 0 :(得分:16)
当Greenlet死亡时,故意不保存回溯。如果它被保存了,它会保留许多预期会被删除的对象,这对象特别重要,如果对象管理一些资源(打开文件或套接字)。
如果你想保存追溯,你必须自己做。
答案 1 :(得分:1)
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)