Appending traceback from exception in child thread
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Fri May 15 23:02:28 EDT 2009
En Fri, 15 May 2009 15:09:45 -0300, Edd <edd at nunswithguns.net> escribió:
> As the comment on the last line indicates, looking at the .value() of
> a Future may give the return value of the associated task, or it may
> also propagate an exception that was raised in a child thread.
>
> Inside the implementation I store caught exceptions with code that
> looks something like:
>
> try:
> self.return_value = self.task()
> except:
> self.exception = sys.exc_info()[1]
>
> The problem I have is that when an exception is propagated in to the
> parent thread by re-raising it, the part of the traceback from the
> child thread is lost. So if the program dies due to such an exception,
> I can't see what caused it by examining the printed traceback.
>
> To solve this problem, I could of course grab the traceback in the
> child thread and create some kind of custom exception that stashes the
> trace inside. This could then be caught on the fringes of my code in
> order to combine the tracebacks of parent and child together before
> printing it. But I was wondering if there might be a nicer way that
> keeps the original exception object. Perhaps something akin to gluing
> the tracebacks together at the point where the exception is re-raised?
You could use the 3-argument form of the raise statement:
http://docs.python.org/reference/simple_stmts.html#the-raise-statement
There is a problem: remember that the traceback object keeps a reference
to all previous frames -- that means, all local variables along the whole
stack of called functions are kept alive until you delete the traceback
object. And depending on your application, that might involve thousand of
objects "artificially" alive for an undeterminate period of time...
It it's just for logging/debugging and you don't require access to the
"live" objects, using a custom attribute in the exception object to store
a list of strings (like the one traceback.extract_tb builds) may be a
better idea.
--
Gabriel Genellina
More information about the Python-list
mailing list