多线程环境中的Ruby错误报告

时间:2014-08-17 05:33:24

标签: ruby multithreading

我正在尝试用Ruby编写多线程程序。线程内发生的错误不会向stdout报告错误消息。我把我的代码减少到一个最小的程序来演示。

在第一个例子中,我在主块中创建了一个带有无意义语句的错误:

puts "hello"
blah
my_thread = Thread.new do
end
sleep 1

在这种情况下,通常会报告错误:

  

$ ruby​​ bin / test.rb
  $ hello
  $ bin / test.rb:2:in <main>': undefined local variable or method blah&#39; for main:Object(NameError)

但是,如果我将引起错误的调用放在线程中:

my_thread = Thread.new do
  puts "hello"
  blah
end
sleep 1

没有报告错误:

  

$ ruby​​ bin / test.rb
  喂

如果我将puts语句移动到导致错误的调用之后它永远不会被执行,那么错误必须是停止执行(线程的)。

我也尝试过使用异常处理 - 以下都没有向stdout发送错误:

my_thread = Thread.new do
  begin
    puts "hello"
    blah
  rescue StandardError => msg
    puts "Error: " + msg
  end
end
sleep 1

或:

begin
my_thread = Thread.new do
    puts "hello"
    blah
end
rescue StandardError => msg
  puts "Error: " + msg
end
sleep 1

我已经尝试过包含better_errors gem,希望它能正常运行&#39;就像在拥有它的Rails项目中一样,我的结果也不例外。

我也尝试在我的IDE(RubyMine)中调试程序,但线程内部的断点永远不会受到攻击。

1 个答案:

答案 0 :(得分:0)

如果您join该主题,您将收到错误消息。

my_thread = Thread.new do
  puts 'hello'
  blah
end
my_thread.join  # <-----

输出:

hello
t.rb:3:in `block in <main>': undefined local variable or method `blah' for main:Object (NameError)

或者,您可以使用Thread#value(它调用Thread#join)。

根据Thread#join文档:

  

...

     

当主程序退出时,任何未加入的线程都将被终止。如果   thr先前已经引发了异常并且abort_on_exception和   未设置$ DEBUG标志(因此尚未处理异常)   此时将处理