Я ищу решение классической проблемы обработки исключений. Рассмотрим следующий фрагмент кода:
def foo(n)
puts " for #{n}"
sleep n
raise "after #{n}"
end
begin
threads = []
[5, 15, 20, 3].each do |i|
threads << Thread.new do
foo(i)
end
end
threads.each(&:join)
rescue Exception => e
puts "EXCEPTION: #{e.inspect}"
puts "MESSAGE: #{e.message}"
end
Этот код перехватывает исключение через 5 секунд.
Но если я изменю массив на [15, 5, 20, 3]
, приведенный выше код перехватит исключение через 15 секунд. Короче говоря, он всегда перехватывает исключение, возникшее в первом потоке.
Любая идея, почему так. Почему он не ловит исключение через 3 секунды каждый раз? Как мне перехватить первое возбужденное исключение в каком-либо потоке?