Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > worker thread catching exceptions and putting them in queue

Reply
Thread Tools

worker thread catching exceptions and putting them in queue

 
 
Paul Sijben
Guest
Posts: n/a
 
      03-05-2007
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
 
Reply With Quote
 
 
 
 
Diez B. Roggisch
Guest
Posts: n/a
 
      03-05-2007
Paul Sijben wrote:

> 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
 
Reply With Quote
 
 
 
 
Stargaming
Guest
Posts: n/a
 
      03-05-2007
Paul Sijben schrieb:
> 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.ht...00000000000000

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.
 
Reply With Quote
 
Paul Sijben
Guest
Posts: n/a
 
      03-06-2007
Stargaming & Diez,

thanks very much!

Stargaming wrote:
> Paul Sijben schrieb:
>> 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.ht...00000000000000
>
> 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.

 
Reply With Quote
 
Aahz
Guest
Posts: n/a
 
      03-08-2007
In article <45ec4936$0$323$(E-Mail Removed)4all.nl>,
Paul Sijben <(E-Mail Removed)> wrote:
>
>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.
--
Aahz ((E-Mail Removed)) <*> http://www.pythoncraft.com/

"I disrespectfully agree." --SJM
 
Reply With Quote
 
Gabriel Genellina
Guest
Posts: n/a
 
      03-08-2007
En Thu, 08 Mar 2007 13:31:14 -0300, Aahz <(E-Mail Removed)> escribió:

> In article <45ec4936$0$323$(E-Mail Removed)4all.nl>,
> Paul Sijben <(E-Mail Removed)> wrote:
>>
>> 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?

>
> 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.

--
Gabriel Genellina

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Program blocked in Queue.Queue.get and Queue.Queue.put Kris Python 0 01-04-2012 03:46 PM
Catching thread exceptions (Net::IMAP timeout) anselm Ruby 2 03-22-2007 11:31 AM
Is Queue.Queue.queue.clear() thread-safe? Russell Warren Python 4 06-27-2006 03:03 PM
I can map all files (.*) to asp.net worker.How do I map NO FILE to asp.net worker? alex ASP .Net 1 02-04-2005 03:18 AM
Catching thread exceptions Steve Tuckner Ruby 2 08-08-2003 05:56 PM



Advertisments