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



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

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

我在如何从 ruby 线程获取错误消息中找到了一个建议使用 catch 的答案,我认为这就是我想走的方式,但我无法完全弄清楚该怎么做。还是有更好的方法?我还找到了一个建议使用Queue类的答案,但担心它可能矫枉过正。

如果你打开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>}

最新更新