2012-11-16 50 views
2

如何从另一个线程捕获异常?如何从另一个线程捕获异常

  • 我想对于一些特定线程做到这一点,而不是其他线程,所以我不能abort_on_exception转向true
  • 我想在主线程中做一些例外,所以我不能简单地在异常中引发的线程内执行putspp等。

我找到了答案在How to get error messages from ruby threads那建议使用catch,我认为这是我想要走的路,但我不能没有完全弄清楚如何做到这一点。或者,还有更好的方法?我也找到了一个答案,建议使用Queue类,但担心它可能是过度杀伤。

回答

2

如果您打开abort_on_exception,那么您将无法抓住它。但是,您可以将其关闭,只需在线上执行join操作即可。

thread = Thread.new do 
    raise "Uh oh" 
end 

begin 
    thread.join 
rescue => e 
    puts "Caught exception: #{e}" 
end 

另一种方法是让线程捕捉它自己的异常并将其保存在某处,以便稍后可以取回它。例如:

exceptions = { } 

Thread.new do 
    begin 
    raise "Uh oh" 
    rescue => e 
    exceptions[Thread.current] = e 
    end 
end 

sleep(1) 

puts exceptions.inspect 
# => {#<Thread:0x007f9832889920 dead>=>#<RuntimeError: Uh oh>} 
+0

需要注意的一件事是,当您加入'线程时,主线程将等待加入的线程完成。为了使第二种方法最大限度地利用并发性。 –