Appending traceback from exception in child thread
Diez B. Roggisch
deets at nospam.web.de
Sat May 16 03:45:57 EDT 2009
Edd schrieb:
> Hi folks,
>
> I have a some threadpool code that works like this :
>
> tp = ThreadPool(number_of_threads)
> futures = [tp.future(t) for t in tasks] # each task is callable
> for f in futures:
> print f.value() # <-- may propagate an exception
>
> The idea being that a Future object represents a value that may or may
> not have been computed yet and the .value() method will block until
> that value is ready.
>
> 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?
If you are only interested in the original traceback, you can get that
with the traceback.format function.
Then you don't need to re-raise it in the main-thread, or if so, use the
formatted stacktrace as payload to an exception.
Diez
More information about the Python-list
mailing list