Handle exception thrown in nested threads from top level thread

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

···

--
There was only one Road; that it was like a great river: its springs
were at every doorstep, and every path was its tributary.

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

···

On 18.09.2006 12:15, hemant wrote:

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?