Подтвердить что ты не робот

Как получить сообщения об ошибках из рубиновых потоков

У меня возникла проблема прямо сейчас, когда я не вижу, где мои дочерние потоки выдают сообщения об ошибках, что затрудняет отладку.

например:

Thread.new{
    a = 1/0
}

Есть ли способ распечатать все ошибки потока в stderr?

4b9b3361

Ответ 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
}

результат: #<ZeroDivisionError: divided by 0>