Регистрация ошибок от фонового процесса ruby? - PullRequest
0 голосов
/ 08 марта 2011

Я создал небольшой скрипт, который запускается в фоновом режиме для чтения и ответа на многоадресные запросы, но кажется, что при некоторых запросах он иногда дает сбой. Я использовал syslog для записи значений различных элементов в лог-файл, но причина сбоя не записывается и не выводится, потому что он выполняется в отдельном потоке как фоновый процесс. Есть ли способ, как я могу поймать ошибку, которая происходит в приложении (у меня есть блоки восстановления для исключений, но все еще есть проблемы, которые не регистрируются), и записать его где-нибудь, когда я запускаю его как фоновый процесс

1 Ответ

1 голос
/ 08 марта 2011

В вашем приложении, если вы спасаете только подклассы Exception, тогда будут некоторые ошибки, которые вызывают Exception, которые вы не будете захватывать.

Используйте rescue Exception => e, и вы должны захватывать все, что вызывает исключение или один из его подклассов.

Тим Брей имеет хороший фрагмент кода для отображения иерархии исключений в применении к вашему Ruby и гемам:

exceptions = []
tree = {}
ObjectSpace.each_object(Class) do |cls|
  next unless cls.ancestors.include? Exception
  next if exceptions.include? cls
  next if cls.superclass == SystemCallError # avoid dumping Errno's
  exceptions << cls
  cls.ancestors.delete_if {|e| [Object, Kernel].include? e }.reverse.inject(tree) {|memo,cls| memo[cls] ||= {}}
end

indent = 0
tree_printer = Proc.new do |t|
  t.keys.sort { |c1,c2| c1.name <=> c2.name }.each do |k|
    space = (' ' * indent); space ||= ''
    puts space + k.to_s
    indent += 2; tree_printer.call t[k]; indent -= 2
  end
end
tree_printer.call tree
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...