Как получить сообщения об ошибках из рубиновых тем - PullRequest
12 голосов
/ 07 февраля 2009

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

например:

Thread.new{
    a = 1/0
}

Можно ли как-нибудь распечатать все ошибки потока в stderr?

Ответы [ 3 ]

17 голосов
/ 07 февраля 2009

Установите флаг класса Thread abort_on_exception в true.

Альтернативно, оберните тело потока в блоке throw / catch и выведите исключение в catch.

9 голосов
/ 22 января 2010

Установите для $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
6 голосов
/ 08 февраля 2009

Это должно отлавливать любые ошибки, которые вы явно не обрабатываете, и печатать их в STDOUT.

require 'pp'

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...