Thread terminate
Ervin Hegedüs
airween at gmail.com
Thu Aug 28 14:39:00 EDT 2014
Hi Chris,
thanks for you answer,
On Thu, Aug 28, 2014 at 09:23:24AM -0700, Chris Kaynor wrote:
> On Thu, Aug 28, 2014 at 1:52 AM, Ervin Hegedüs <airween at gmail.com> wrote:
> >
> > > In your case, you may want to just handle the exceptions inside the
> > > thread's run() function directly. If that is not possible and you really
> > > need to handle them inside the main thread, you would need to store off
> > the
> > > error data in a variable (either passed into the thread as the "args" or
> > > "kwargs" arguments to the MyThread() call, or global or class variables)
> > > then use mt.join() to wait for the thread(s) to exit.
> >
> > no, I don't need to handle it outside of thread - the point is
> > when the exception raised in a running thread, then the exception
> > be logged (that's no problem), and thread be stopped state, so
> > the caller function is able to call the join() that thread.
>
>
> In this case, all that needs to happen is for the thread's run function to
> either throw an exception (as happens in the error case in your sample
> code) or return.
now the code looks like this:
def run(self):
try:
connect_to_db()
except:
self._exit(-1, "Connection error", sys.exc_info()[1])
return True
try:
do_another_thing()
except:
self._exit(-2, "Another error", sys.exc_info()[1])
return True
so, the thread's _exit() functions set many things, logs to
exception error, but not terminate the thread. As you can see,
all except line of try block contains a return - that's what I
wanted to avoid.
> The threading module will cause it to print any exception that occurs by
> default.
yes, I saw that :),
> > yes, the pseudo structure of my code is same as your here. But
> > the now the problem is when an exception raised, that showed at
> > stdout too, not just the log.
> >
>
> If what you want is to make sure the error is not printed to stderr, you'll
> just need to make sure the thread's run function does not exit with an
> exception. The simpliest way to do that would be to wrap the entire
> thread's run function in a try...catch statement, like so:
"""I've re-indented your code below:"""
> class Thread(threading.Thread)
>
> def run(self):
> try:
> # Do your code here.
> # You can also have more specific error-handling inside here if needed.
> except Exception as err:
> # Log your error here - you will be silencing it and therefore unable to
> # see it in the TTY!
Now I don't see the key different between your code, and my
example - looks like there are same. But when I tried to throw an
exception, that showed in TTY. Nevermind, now it works, only the
necessary "return" keyword would be good to leave.
> # If you want to be able to handle the errors in the main thread, you could
> run code like the following:
>
> #self.err = err
>
> # Where you can check and access them on the main thread.
>
> return # Optional if there is no other code outside the try...except.
I don't see your opinion from this snippet, but I think my
solution is very similar like yours :)
Thanks for the help again,
a.
--
I � UTF-8
More information about the Python-list
mailing list