2009-02-07 52 views
12

我现在有一个问题,我看不到我的子线程正在吐出错误信息,这使得它很难调试。如何从ruby线程获取错误消息

如:

Thread.new{ 
    a = 1/0 
} 

有没有办法让所有的线程错误在标准错误打印出来?

回答

16

将Thread类'abort_on_exception标志设置为true。

或者,将线程体包装在一个throw/catch块中,并将该异常转储到catch中。

6

这应该会捕获任何您没有明确处理的错误并将它们打印到STDOUT。

require 'pp' 

Thread.new { 
    begin 
    a = 1/0 
    rescue 
    pp $! 
    end 
} 

结果:#<ZeroDivisionError: divided by 0>

8

设置$DEBUG为true(你可以从-d在命令行中这样做),你会得到

ruby -d bad_thread.rb 
Exception `LoadError' at /usr/lib/ruby/site_ruby/1.8/rubygems.rb:1113 - no such file to load -- rubygems/defaults/operating_system 
Exception `LoadError' at /usr/lib/ruby/site_ruby/1.8/rubygems/config_file.rb:34 - no such file to load -- Win32API 
Exception `ZeroDivisionError' at bad_thread.rb:2 - divided by 0 
bad_thread.rb:2:in `/': divided by 0 (ZeroDivisionError) 
    from bad_thread.rb:2 
    from bad_thread.rb:1:in `initialize' 
    from bad_thread.rb:1:in `new' 
    from bad_thread.rb:1 
+1

谢谢!这使我在一个麻烦的DRb服务器上的调试速度提高了一个数量级。 – Phrogz 2011-06-06 20:42:41