views:

922

answers:

3

Is there a way to tell if a thread has exited normally or because of an exception?

A: 

You could set some global variable to 0 if success, or non-zero if there was an exception. This is a pretty standard convention.

However, you'll need to protect this variable with a mutex or semaphore. Or you could make sure that only one thread will ever write to it and all others would just read it.

samoz
0 for success may be a pretty standard convention, but wouldn't a boolean `succeded` be a little easier on the meat interpreter?
Daren Thomas
It doesn't have to be global if I subclass Thread, just need a member variable in that to indicate success. I was just wondering if there is any builtin way to do this, like the process exit code.
Jiayao Yu
Threads and global state. Two great tastes tthat tate gsrat eogetherrrrrrrrrrrrrrr Segmentation fault, core dumped.
Glyph
@Glyph note how I mentioned mutexs and semaphores though.
samoz
A: 

Have your thread function catch exceptions. (You can do this with a simple wrapper function that just calls the old thread function inside a try...except or try...except...else block). Then the question just becomes "how to pass information from one thread to another", and I guess you already know how to do that.

user9876
+3  A: 

As mentioned, a wrapper around the Thread class could catch that state. Here's an example.

>>> from threading import Thread
>>> class MyThread(Thread):
    def run(self):
     try:
      Thread.run(self)
     except Exception as self.err:
      pass # or raise
     else:
      self.err = None


>>> mt = MyThread(target=divmod, args=(3, 2))
>>> mt.start()
>>> mt.join()
>>> mt.err
>>> mt = MyThread(target=divmod, args=(3, 0))
>>> mt.start()
>>> mt.join()
>>> mt.err
ZeroDivisionError('integer division or modulo by zero',)
Coady