Как настроить общий ответ обработчика ошибок / исключений в Ruby? - PullRequest
0 голосов
/ 23 августа 2011

Я работаю над этой проблемой: Уведомление об исключении Rails в задачах rake

Мой вопрос: Есть ли какая-либо функция / плагин / gem / что-либо для настройкиуниверсальный обратный вызов обработчика ошибок / исключений, как в PHP с set_error_handler и set_exception_handler?

Мне нужен способ регистрации функции обратного вызова, используемой как перехватвне любого begin .. rescue .. end блока.Например:

def my_handler *args
  # exception processing code here
end

some_magic_method my_handler

raise "An Exception" # this will be handled by my_handler

В PHP это может быть достигнуто с помощью функции set_exception_handler.Есть ли такая функция в Ruby / Rails?

Если бы такая функция существовала, я мог бы решить мою предыдущую проблему простым способом.

Решение только на Rails подойдет для моих нужд.

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

Я не верю, что Ruby предоставляет способ сделать это, либо с исключениями, либо с помощью throw / catch. В общем, делать что-то подобным образом - это запах кода и чего следует избегать. Это делает поток управления чрезвычайно сложным для понимания. Я бы попытался найти другой способ решения этой проблемы, если это вообще возможно.

1 голос
/ 23 августа 2011

Если вы хотите сделать это в цикле обработки HTTP-запросов, вы можете использовать обходной фильтр в контроллере приложения:

class ApplicationController < ActionController::Base
  around_filter do |controller, action|
    action.call
  rescue ExceptionXPTO
     # ... handle the exception ...
  end
end
0 голосов
/ 24 августа 2011

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

#!/usr/bin/env ruby

at_exit do
  if $!
    puts "Program ended with an exception #{$!.message}"
    puts $!.backtrace.join("\n")
    # or log the exception here
  end
end

loop do
  value = rand(3)
  puts "Value is #{value}"
  break if value == 2 
  raise "An Exception" if value == 0
end

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