worker thread catching exceptions and putting them in queue

P

Paul Sijben

All,

in a worker thread setup that communicates via queues is it possible to
catch exceptions raised by the worker executed, put them in an object
and send them over the queue to another thread where the exception is
raised in that scope?

considering that an exception is an object I feel it ought to be
possible, however I do not see how to go about it.

does anyone have a pointer towards the solution?

Paul
 
D

Diez B. Roggisch

Paul said:
All,

in a worker thread setup that communicates via queues is it possible to
catch exceptions raised by the worker executed, put them in an object
and send them over the queue to another thread where the exception is
raised in that scope?

considering that an exception is an object I feel it ought to be
possible, however I do not see how to go about it.

does anyone have a pointer towards the solution?


Just raise the exception object found in the queue. Only make sure it _is_
an exception, as you can raise everything. So in your queue-putting-code
you might consider discriminating between the two cases, like this:


while True:
try:
result = 1, work()
except:
result = 2, sys.exc_info()[1]
queue.put(result)

-------
while True:
kind, result = queue.get()
if kind == 1:
do(result)
elif kind == 2:
raise result


Diez
 
S

Stargaming

Paul said:
All,

in a worker thread setup that communicates via queues is it possible to
catch exceptions raised by the worker executed, put them in an object
and send them over the queue to another thread where the exception is
raised in that scope?

considering that an exception is an object I feel it ought to be
possible, however I do not see how to go about it.

does anyone have a pointer towards the solution?

Paul

You're right, even exceptions are objects in Python. For further
studies, read http://docs.python.org/lib/module-exceptions.html

You can catch an exception like this:
try:
worker.do_some_work_that_may_raise_an_exception()
except Exception, e:
# the first argument is the type of error you want to handle
# it is Exception here, the baseclass of all computation exceptions
# the second argument is the variable (name) where you want to save
# the specific exception raised to
# it's 'e' here, a common shortcut for exception
exception_handler.handle(e)
# notice that you can pass e around as you like

For further information on exceptions and how to handle them, read
chapter 8 of the tutorial, especially starting from 8.3:
http://docs.python.org/tut/node10.html#SECTION0010300000000000000000

P.S. I don't know if what I told still applies to Python 3.0 -- a lot of
changes are upcoming related to exception raising and handling.
 
P

Paul Sijben

Stargaming & Diez,

thanks very much!
You're right, even exceptions are objects in Python. For further
studies, read http://docs.python.org/lib/module-exceptions.html

You can catch an exception like this:
try:
worker.do_some_work_that_may_raise_an_exception()
except Exception, e:
# the first argument is the type of error you want to handle
# it is Exception here, the baseclass of all computation exceptions
# the second argument is the variable (name) where you want to save
# the specific exception raised to
# it's 'e' here, a common shortcut for exception
exception_handler.handle(e)
# notice that you can pass e around as you like

For further information on exceptions and how to handle them, read
chapter 8 of the tutorial, especially starting from 8.3:
http://docs.python.org/tut/node10.html#SECTION0010300000000000000000

P.S. I don't know if what I told still applies to Python 3.0 -- a lot of
changes are upcoming related to exception raising and handling.
 
A

Aahz

in a worker thread setup that communicates via queues is it possible to
catch exceptions raised by the worker executed, put them in an object
and send them over the queue to another thread where the exception is
raised in that scope?

considering that an exception is an object I feel it ought to be
possible, however I do not see how to go about it.

One caution: because exceptions keep stack frames alive, you can have
garbage collection problems. Make sure to del the exception when you're
done with it.
 
G

Gabriel Genellina

One caution: because exceptions keep stack frames alive, you can have
garbage collection problems. Make sure to del the exception when you're
done with it.

Note that it's the traceback who keeps stack frames alive, not the
exception itself (at least on the current Python versions, might change in
the future). If no fancy processing of the traceback is needed, maybe
converting it to string (using the traceback module) before posting it to
the queue is enough.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top