如何从另一个线程捕获异常?
- 我想对某个特定线程执行此操作,而不是对其他线程执行此操作,因此我无法将
abort_on_exception
打开为true
。 - 我想在主线程中执行一些带有异常的操作,因此我不能简单地对引发的线程中的异常执行
puts
、pp
等操作异常(exception)。
我在 How to get error messages from ruby threads 中找到了答案这建议使用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>}
关于ruby - 如何从另一个线程捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13410468/