Robert Klemme
9/18/2006 10:40:00 AM
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