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

标签 ruby multithreading exception

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

  • 我想对某个特定线程执行此操作,而不是对其他线程执行此操作,因此我无法将 abort_on_exception 打开为 true
  • 我想在主线程中执行一些带有异常的操作,因此我不能简单地对引发的线程中的异常执行 putspp 等操作异常(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/

相关文章:

ruby 正则表达式提取两部分 : digits, 然后之后的任何内容

c++ - 在作用域结束之前调用析构函数

ruby-on-rails - Rails 4 Controller 操作,救援 block 未按预期工作?

java - 如何以正确的顺序获取 stdout 和 stderr 打印

ruby - ruby中打包ASCII算法更优雅的实现

ruby - 救援 rake 任务

ruby - 我需要一个正则表达式来捕获字符串中的数字

c# - 在后台工作线程中使用 C# 全局变量是否安全

Java : threaded serial port read with Java. util.concurrent 线程访问

java - Android 中任何线程中的异常为何以及如何导致整个应用程序崩溃