2

別のスレッドから例外をキャプチャするにはどうすればよいですか?

  • 他のスレッドではなく、特定のスレッドに対してこれを実行したいので、をオンにすることはできませabort_on_exceptiontrue
  • 例外を除いてメインスレッドで何かをしたいので、例外で発生したスレッド内で例外を使って、、などをputs単純に行うことはできません。pp

「ルビースレッドからエラーメッセージを取得する方法」で、の使用を提案する答えを見つけましたcatch。それが私がやりたい方法だと思いますが、その方法を完全に理解することはできません。それとももっと良い方法はありますか?クラスを使うことを提案する答えも見つけましたQueueが、それがやり過ぎかもしれないのではないかと心配しています。

4

1 に答える 1

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>}
于 2012-11-16T04:47:08.777 に答える