By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,818 Members | 1,262 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,818 IT Pros & Developers. It's quick & easy.

multithread exception handling

P: n/a
Hello.

I have problem and I ask you for help. Probably there is some quite
easy solution, but I can't see it.

I'm trying to perform some action that have to be timeout safe. So here
is the structure of my program:

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
def TimeoutHandler():
print '!'
raise Exception

class Active:
def Action:
timer = Timer(1, TimeoutHandler)
print '1'
timer.start()
try:
print '2'
time.sleep(20)
print '3'
except:
print '4'
else:
print '5'
timer.cancel()
print '6'

active = Actice()

///////////////////////////////////////////
The output is:
12!356

My question is, why exception is not raised correctly? Could be the
reason that (probably) timer is another thread and there is no
exception in the main thread? How to solve this problem? [My timeout
should be smaller than one second so I can't use signal.alarm()]

Thanks for your reply,
Krzysztof Nowak

Sep 19 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
pe*****@gmail.com wrote:
Hello.

I have problem and I ask you for help. Probably there is some quite
easy solution, but I can't see it.

I'm trying to perform some action that have to be timeout safe. So here
is the structure of my program:

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
def TimeoutHandler():
print '!'
raise Exception

class Active:
def Action:
timer = Timer(1, TimeoutHandler)
print '1'
timer.start()
try:
print '2'
time.sleep(20)
print '3'
except:
print '4'
else:
print '5'
timer.cancel()
print '6'

active = Actice()

///////////////////////////////////////////
The output is:
12!356

My question is, why exception is not raised correctly? Could be the
reason that (probably) timer is another thread and there is no
exception in the main thread? How to solve this problem? [My timeout
should be smaller than one second so I can't use signal.alarm()]

Thanks for your reply,
Krzysztof Nowak


As far as I can see, the exception is raised in the CORRECT
thread - the one (belonging to the Timer) that is executing a
raise statement.

If you want to raise an exception in a different thread, you have
to arrange some inter-thread communication. Except that the way
to communicate between threads is to share an object where one
thread writes to an object's state and another waits for or
periodically checks for a change in the objects state.

It's difficult to say more without knowing what problem you are
trying to solve.

Steve
Sep 19 '05 #2

P: n/a
>>>>> pe*****@gmail.com (p) wrote:

[Timer example snipped]
p> My question is, why exception is not raised correctly? Could be the
p> reason that (probably) timer is another thread and there is no
p> exception in the main thread?


yes, the doc of Timer says it is a subclass of Thread, and therefore runs in
a new thread.
By the way, your program isn't even correct Python, so how can it give the
output you have written down?

When I run a similar (but corrct python) program, I do get an exception,
but it is in another thread, and therefore not caught.
You can post a signal to the main thread, however, to catch the exception:

def TimeoutHandler():
print '!'
os.kill(0, signal.SIGUSR1)

def handler():
raise Exception

class Active:
def __init__(self):
signal.signal(signal.SIGUSR1, handler)
timer = Timer(1, TimeoutHandler)
etc.
--
Piet van Oostrum <pi**@cs.uu.nl>
URL: http://www.cs.uu.nl/~piet [PGP 8DAE142BE17999C4]
Private email: pi**@vanoostrum.org
Sep 20 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.