我需要立即捕获线程中的异常并停止所有线程,因此我在脚本中使用了 abort_on_exception。不幸的是,这意味着异常不会引发到父线程 - 也许这是因为异常最终发生在全局范围内?
无论如何,这是一个显示问题的示例:
Thread.abort_on_exception = true
begin
t = Thread.new {
puts "Start thread"
raise saveMe
puts "Never here.."
}
t.join
rescue => e
puts "RESCUE: #{e}"
ensure
puts "ENSURE"
end
使用 abort_on_exception 时,如何挽救线程中引发的异常?
这是一个新的例子,它展示了更令人难以置信的东西。线程能够在开始块内终止执行,但它不会引发任何异常?
Thread.abort_on_exception = true
begin
t = Thread.new { raise saveMe }
sleep 1
puts "This doesn't execute"
rescue => e
puts "This also doesn't execute"
ensure
puts "But this does??"
end