Ruby:救援不会从线程中拯救

时间:2014-11-11 00:27:26

标签: ruby multithreading rescue

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块。但是有一个问题仍然存在 - 为什么不足以拯救一个人?

编辑包装在另一个救援区有帮助,但并非总是如此 - 有时它仍然无法救援。

1 个答案:

答案 0 :(得分:3)

你所写的内容存在一些问题,我认为这些问题会让你蒙混过关。

  1. 除非您确实希望程序在辅助线程中发生异常时中止,否则不应设置Thread.abort_on_exception = true。通常,您只希望此设置为true以进行调试。如果设置为false,则线程中引发的任何异常都将导致该线程退出,但只有当您join使用子线程时,父线程才会看到该线程。

  2. 在上面的代码中,当您尝试使用线程加入时,变量a超出了范围。因此,你也应该得到一个NameError

  3. 即使这是在范围内,您也只是加入了一个主题。

  4. 您应该找到以下更可预测的内容:

    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