我正在尝试用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)中调试程序,但线程内部的断点永远不会受到攻击。
答案 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标志(因此尚未处理异常) 此时将处理。