Thread.abort_on_exception = true
begin
#code in this block doesn't matter at all, it just needs to produce errors.
[1, 2].each do |i|
a = Thread.new do
errory
end
end
a.join
rescue Exception
puts 'error!'
end
由于某种原因,提出/home/lakesare/Desktop/multithreading/test.rb:6:in 'block (2 levels) in <main>': undefined local variable or method 'errory' for main:Object (NameError)
而不是返回error!
如果Thread.new {}
未包含each {}
,则可以正确获取该块
这是为什么?在这种情况下如何正确拯救我的线程?
编辑我发现在相同的块帮助中包装begin-rescue-end
块。但是有一个问题仍然存在 - 为什么不足以拯救一个人?
编辑包装在另一个救援区有帮助,但并非总是如此 - 有时它仍然无法救援。
答案 0 :(得分:3)
你所写的内容存在一些问题,我认为这些问题会让你蒙混过关。
除非您确实希望程序在辅助线程中发生异常时中止,否则不应设置Thread.abort_on_exception = true
。通常,您只希望此设置为true以进行调试。如果设置为false,则线程中引发的任何异常都将导致该线程退出,但只有当您join
使用子线程时,父线程才会看到该线程。
在上面的代码中,当您尝试使用线程加入时,变量a
超出了范围。因此,你也应该得到一个NameError
。
即使这是在范围内,您也只是加入了一个主题。
您应该找到以下更可预测的内容:
Thread.abort_on_exception = false
begin
threads = [1, 2].collect do |i|
Thread.new do
errory
end
end
threads.each { |thread| thread.join } # You might want to use a ThreadsWait here instead.
rescue Exception
puts 'error!'
end