Reputation: 3944
I've spawned a Greenlet and linked it to a callable. Some time later, the Greenlet fails with an Exception. The linked callable gets called. That's all great!
Here's the issue:
The traceback for the Exception appears on my console, as you'd expect. But I want do things with that traceback within the linked callable. How do I get access to that traceback within the linked callable?
(My first instinct was to use traceback.extract_stack()
, but it turns out that provides a traceback for the linked callable itself and not for the Exception.)
Upvotes: 6
Views: 3543
Reputation: 317
As an alternative to Stephen Diehl's solution using 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)
Upvotes: 2
Reputation: 3780
The traceback is intentionally not saved when the Greenlet dies. If it was saved, it would keep a lot of objects alive that are expected to be deleted, which matters especially if the object manages some resource (open file or socket).
If you want to save the traceback you have to do it yourself.
Upvotes: 17
Reputation: 8419
Just make sure you grab the exception
value of the Greenlet and throw it outside the Greenlet, for example get
returns either the value returned or raises the internal exception.
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
Should give you what you need.
Upvotes: 1
Reputation: 527053
The Greenlet
object should have an exception
property that you can look at:
http://www.gevent.org/gevent.html#gevent.Greenlet.exception
Upvotes: 1