У меня сейчас проблема, когда я не вижу, где мои дочерние потоки выкладывают сообщения об ошибках, что затрудняет отладку.
например:
Thread.new{ a = 1/0 }
Можно ли как-нибудь распечатать все ошибки потока в stderr?
Установите флаг класса Thread abort_on_exception в true.
abort_on_exception
Альтернативно, оберните тело потока в блоке throw / catch и выведите исключение в catch.
Установите для $DEBUG значение true (вы можете сделать это из командной строки с помощью -d), и вы получите
$DEBUG
-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
Это должно отлавливать любые ошибки, которые вы явно не обрабатываете, и печатать их в STDOUT.
require 'pp' Thread.new { begin a = 1/0 rescue pp $! end }
результат: #<ZeroDivisionError: divided by 0>
#<ZeroDivisionError: divided by 0>