我生成了一个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
应该给你你需要的。