Ruby эквивалент PHPs set_error_handler

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я едва освоился с Ruby / ROR, но мне нужно быстро написать класс для обработки ошибок и что-то с ними делать. Я смог найти важные примеры / руководства для остальной части того, что мне нужно, но у меня возникли проблемы с поиском наилучшей альтернативы PHP «set_error_handler».

Мои цели таковы:

  • Я хотел бы написать класс, который будет автоматически фиксировать любые ошибки уровня ruby.
  • Я бы хотел, чтобы класс также вызывался пользователем при наличии пользовательских ошибок / исключений для отчета.

Я бы хотел, чтобы это работало для любого приложения на ruby, но мое основное внимание также уделяется приложениям ruby-on-rails. Спасибо за ваш совет.

Комментарии:

1. В Ruby они называются исключениями.

2. Существует ли стандартный способ захвата всех исключений? (без попыток / перехватов везде)

Ответ №1:

Я думаю, что ближайшим эквивалентом в Rails является rescue_from — он позволяет вам указать, что код будет перехватывать любое заданное исключение (за исключением некоторых ошибок шаблона — хотя есть способы обойти это). Если вы хотите, вы могли бы затем передать его какому-либо другому классу. Итак, я думаю, что вы бы сделали в вашем случае, было бы:

в app / controllers /application_controller.rb:

 class ApplicationController < ActionController::Base
  rescue_from Exception do |e|
    MyExceptionHandler.handle_exception(e)
  end
end
  

в библиотеке/my_exception_handler.rb:

 class MyExceptionHandler
  def self.handle_exception exception
    # your code goes here
  end
end
  

Если это поможет, дайте мне знать, и я найду ссылку на то, как вы обнаруживаете ошибки шаблона.

Комментарии:

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

2. Хорошо, готово — страница, на которой я впервые услышал о rescue_from, также касается проблемы с ошибкой шаблона: perfectline.ee/blog/custom-dynamic-error-pages-in-ruby-on-rails

Ответ №2:

 begin
  #require all_kinds_of_things
  "abc".size(1,2)
  123.reverse
  # rest of brilliant app
rescue Exception => e #Custom, catch-all exeption handler
  puts "Doh...#{e}"
  print "Do you want the backtrace? (Y) :"
  puts e.backtrace if gets.chomp == "Y"
end
  

Ответ №3:

Определите ApplicationController#rescue_in_public(exception) и поместите туда свой пользовательский код обработки.

Это увеличивает обработку исключений Rails по умолчанию на верхнем уровне — прямо перед генерированием HTTP-ответа. По мере усложнения ваших приложений Rails и использования внешних ресурсов будет появляться все больше исключений, которые вам захочется обрабатывать гораздо ближе к месту возникновения исключений, но это может помочь вам начать.

Этот метод будет работать только с HTTP-запросами и не будет перехватывать исключения в любых пользовательских задачах rake, которые вы создаете, или в коде, выполняемом через rails runner .

Вот пример из одного из моих приложений:

 class ApplicationController < ActionController::Base
  ...
  protected

  def rescue_action_in_public (exception)
    case exception
    when ActionController::InvalidAuthenticityToken
      if request.xhr?
        render :update do |page|
          page.redirect_to '/sessions/new/'
        end
      else
        redirect_to '/sessions/new/'
      end
    when ActionController::NotImplemented
      RAILS_DEFAULT_LOGGER.info("ActionController::NotImplementedn#{request.inspect}")
      render :nothing => true, :status => '500 Error'
    else
      super
    end
  end
end