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
2009-06-12 13:33:12
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
2009-06-12 13:38:12
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
2009-06-12 13:48:11
Threads and global state. Two great tastes tthat tate gsrat eogetherrrrrrrrrrrrrrr Segmentation fault, core dumped.
Glyph
2009-06-15 14:55:05
@Glyph note how I mentioned mutexs and semaphores though.
samoz
2009-06-15 15:20:16
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
2009-06-12 13:43:05
+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
2009-06-12 15:03:59