我正在寻找经典的异常处理问题的解决方案。考虑以下代码:
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秒后捕获异常?如何捕获任何线程引发的第一个异常?
begin
-rescue
-end
子句中包装整个线程体; 所有的异常将在Thread#join
处重新引发。 - Franklin YuThread.abort_on_exception = true
是一个全局设置,因此请注意它可能会破坏应用程序或其依赖项中预期的默认行为。除非是非常简单的脚本,否则建议使用t.abort_on_exception = true
方法。请注意不要改变原来的意思。 - Joakim Kolsjö