Я ищу решение классической проблемы обработки исключений. Рассмотрим следующий фрагмент кода:
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 секунды каждый раз? Как я могу поймать первое поднятое исключение любым потоком?