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

时间:2012-11-16 04:33:44

标签: ruby multithreading exception-handling

如何从其他线程捕获异常?

  • 我想为某个特定线程而不是其他线程执行此操作,因此我无法将abort_on_exception打开到true
  • 我想在主线程中做一些异常,所以我不能简单地执行putspp等等异常中引发的线程中的异常。

我在How to get error messages from ruby threads中找到了一个建议使用catch的答案,我认为这是我想要的方式,但我不能完全弄清楚如何去做。或者,还有更好的方法?我还找到了一个建议使用Queue课程的答案,但担心这可能有点过分。

1 个答案:

答案 0 :(得分: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>}