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
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:
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
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.