Как получить сообщения об ошибках из рубиновых потоков
У меня возникла проблема прямо сейчас, когда я не вижу, где мои дочерние потоки выдают сообщения об ошибках, что затрудняет отладку.
например:
Thread.new{
a = 1/0
}
Есть ли способ распечатать все ошибки потока в stderr?
Ответ 1
Установите для класса Thread < abort_on_exception значение true.
В качестве альтернативы, оберните тело потока в блоке throw/catch и выгрузите исключение в catch.
Ответ 2
Установите $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
Ответ 3
Это должно уловить любые ошибки, которые вы явно не обрабатываете и не печатаете в STDOUT.
require 'pp'
Thread.new {
begin
a = 1/0
rescue
pp $!
end
}