我生成了一个 Greenlet 并将其链接到一个可调用对象。一段时间后,Greenlet 因异常而失败。链接的可调用对象被调用。这一切都很棒!
这是问题:
如您所料,异常的回溯出现在我的控制台上。但我想在链接的可调用文件中使用该回溯来做事。如何在链接的可调用文件中访问该回溯?
(我的第一个直觉是使用traceback.extract_stack()
,但事实证明它为链接的可调用对象本身提供了回溯,而不是为异常提供了回溯。)
我生成了一个 Greenlet 并将其链接到一个可调用对象。一段时间后,Greenlet 因异常而失败。链接的可调用对象被调用。这一切都很棒!
这是问题:
如您所料,异常的回溯出现在我的控制台上。但我想在链接的可调用文件中使用该回溯来做事。如何在链接的可调用文件中访问该回溯?
(我的第一个直觉是使用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
您可以查看的属性:
只需确保您获取exception
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
应该给你你需要的。