Ruby 为什么我没有从线程块中得到任何错误?
我正在运行一个rails 4应用程序,在libs下的一个模块中有一个代码行,它会引发某种异常,但是rails控制台和开发人员控制台中都没有显示这一点?所以我很幸运地找到了上面提到的代码行?为什么没有例外和stacktrace?或者如何找到错误的来源 例如,我必须跟随Ruby 为什么我没有从线程块中得到任何错误?,ruby,Ruby,我正在运行一个rails 4应用程序,在libs下的一个模块中有一个代码行,它会引发某种异常,但是rails控制台和开发人员控制台中都没有显示这一点?所以我很幸运地找到了上面提到的代码行?为什么没有例外和stacktrace?或者如何找到错误的来源 例如,我必须跟随 Thread.new { @rates.each do |rate| rate.save_rate unless rate.total.nil? or rate.total.empty end } rate.t
Thread.new {
@rates.each do |rate|
rate.save_rate unless rate.total.nil? or rate.total.empty
end
}
rate.total是一个fixnum,我得到一个错误,因为是空的?在fixnum上不可能。可能与线程有关吗 更新:另外,请参见@zettetic的评论
如果这是您的全部代码,那么这是因为您调用了一个新线程,而不是等待它完成。这意味着,ruby解释器触发一个线程,当脚本结束时,它立即退出,所以线程块中的任何内容都没有机会执行
尝试从终端运行此脚本:
Thread.new do
raise "won't see me"
end
几乎可以肯定的是,你不会看到任何事情发生
现在让我们等待线程使用join完成
如果我运行$ruby t.rb,我最终可以在stdout中看到一个错误:
t.rb:2:in `block in <main>': won't see me (RuntimeError)
如果我添加了一些东西,我不建议使用线程,除非你真的知道你在做什么。请提供示例代码。这几乎是正确的,但是线程也可能在主程序之前终止,而不产生任何输出,因为线程中发生的异常会导致它安静地死去,除非Thread.abort_on_exception从false更改为true。谢谢@zettetic,我没有注意到abort_on_exception选项。
t.rb:2:in `block in <main>': won't see me (RuntimeError)