Ruby:如何处理线程异常?

时间:2015-10-19 09:41:57

标签: ruby multithreading exception

我的代码在这里......

require 'thread'

$temp = Thread.new do
  loop do
    puts 'loop me'
    begin
      puts "try thread"
      raise Exception.new('QwQ') if rand > 0.5
      puts "skip try"
    rescue
      puts "QwQ"
    end
    sleep(0.5)
  end
  puts '...WTF'
end

loop do
  puts "runner #{Thread.list.length} #{$temp.status}"
  sleep(2)
end

如何让runnerloop thread继续投放?以及如何像这段代码一样修复它?

我试过像Thread.abort_on_exception,但它会杀死进程......

1 个答案:

答案 0 :(得分:0)

在线程内部捕获异常,并将错误设置在主线程可访问的变量中(对于测试,您可以使用如下的全局变量:$ thread_error)。

如果存在错误变量,则从主线程中提起它。

您还可以使用队列在线程之间进行通信,但之后它将无法使用多个线程。

require 'thread'

$temp = Thread.new do
  begin
    loop do
      puts 'loop me'
      begin
        puts "try thread"
        raise Exception.new('QwQ') if rand > 0.5
        puts "skip try"
      rescue
        puts "QwQ"
      end
      sleep(0.5)
    end
    puts '...WTF'
  rescue Exception => e
    $thread_error = e
    raise e
  end
end

loop do
  puts "runner #{Thread.list.length} #{$temp.status}"
  raise $thread_error if $thread_error
  sleep(2)
end