handle exception thrown in nested threads from top level thread

H

hemant

In following code, both methos get_client_symbol and sync_clients gets
called and they start their own new threads. Now, what I would like to
do is, whenever a exception is raised from the nested threads..i would
like to catch them in the toplevel thread.

Now..I have tried many things:
Thread.abort_on_exception = true
and using just rescue or rescue Exception or rescue RuntimeError,
however the exception raised in nested threads won't get caught in the
top level thread. Any clues?

@threads << Thread.new do
child_threads = []

begin
child_threads << get_client_symbol(temp_client_id)
child_threads << sync_clients(temp_client_id)
child_threads.each {|thr| p thr.to_s; thr.join; }

rescue Exception
p $!
p $!.backtrace
# delete the values from list
@connected_clients.synchronize do
@connected_clients.delete(temp_client_id)
@symbols_being_added.signal
end #end of sync
child_threads.each {|thr| Thread.kill(thr) if thr.alive? }
end

end #end of threads
 
R

Robert Klemme

In following code, both methos get_client_symbol and sync_clients gets
called and they start their own new threads. Now, what I would like to
do is, whenever a exception is raised from the nested threads..i would
like to catch them in the toplevel thread.

Now..I have tried many things:
Thread.abort_on_exception = true
and using just rescue or rescue Exception or rescue RuntimeError,
however the exception raised in nested threads won't get caught in the
top level thread. Any clues?

There is no direct way. If you think about it for a moment it's not
possible to catch an exception thrown in another thread. But in Ruby
you can actually do that by rethrowing it in another thread. Try this:


print "Main thread : ", Thread.current.inspect, "\n"

2.times do
Thread.new(Thread.current) do |parent|
print "Child thread: ", Thread.current.inspect, "\n"

loop do
begin
puts "."
raise "Foo" if rand > 0.8
sleep 1
rescue Exception => e
print "Thread : ",
Thread.current.inspect,
": ",
e.inspect,
"\n"
parent.raise e
end
end
end
end


10.times do
begin
sleep 10
rescue Exception => e
print "Thread main: ",
Thread.current.inspect,
": ",
e.inspect,
"\n"
puts e.backtrace
end
end


Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,955
Messages
2,570,117
Members
46,705
Latest member
v_darius

Latest Threads

Top