如何从其他线程捕获异常?
abort_on_exception
打开到true
。puts
,pp
等等异常中引发的线程中的异常。我在How to get error messages from ruby threads中找到了一个建议使用catch
的答案,我认为这是我想要的方式,但我不能完全弄清楚如何去做。或者,还有更好的方法?我还找到了一个建议使用Queue
课程的答案,但担心这可能有点过分。
答案 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>}