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?

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