我現在有一個問題,我看不到我的子線程正在吐出錯誤信息,這使得它很難調試。如何從ruby線程獲取錯誤消息
如:
Thread.new{
a = 1/0
}
有沒有辦法讓所有的線程錯誤在標準錯誤打印出來?
我現在有一個問題,我看不到我的子線程正在吐出錯誤信息,這使得它很難調試。如何從ruby線程獲取錯誤消息
如:
Thread.new{
a = 1/0
}
有沒有辦法讓所有的線程錯誤在標準錯誤打印出來?
將Thread類'abort_on_exception
標誌設置爲true。
或者,將線程體包裝在一個throw/catch塊中,並將該異常轉儲到catch中。
這應該會捕獲任何您沒有明確處理的錯誤並將它們打印到STDOUT。
require 'pp'
Thread.new {
begin
a = 1/0
rescue
pp $!
end
}
結果:#<ZeroDivisionError: divided by 0>
設置$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
謝謝!這使我在一個麻煩的DRb服務器上的調試速度提高了一個數量級。 – Phrogz 2011-06-06 20:42:41