Ответ 1
Если вы хотите, чтобы любое необработанное исключение в любом потоке вызывало выход интерпретатора, вам нужно установить Thread:: abort_on_exception = на true
. Необработанное исключение заставляет поток останавливаться. Если вы не установите для этой переменной значение true, исключение будет поднято только при вызове Thread#join
или Thread#value
для потока. Если установлено значение true, оно будет поднято, когда оно произойдет, и будет распространено на основной поток.
Thread.abort_on_exception=true # add this
def foo(n)
puts " for #{n}"
sleep n
raise "after #{n}"
end
begin
threads = []
[15, 5, 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
Вывод:
for 5
for 20
for 3
for 15
EXCEPTION: #<RuntimeError: after 3>
MESSAGE: after 3
Примечание: но если вы хотите, чтобы какой-либо конкретный экземпляр потока вызывал исключение, таким образом, существует аналогичный abort_on_exception = метод экземпляра потока:
t = Thread.new {
# do something and raise exception
}
t.abort_on_exception = true