Как пропустить запись неисследованных исключений в Rails? - PullRequest
0 голосов
/ 23 сентября 2018

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

Например, приложение знает, как обрабатыватьActionPolicy::Unauthorized, отображает правильную страницу в exceptions_app и, следовательно, следующий журнал является избыточным:

FATAL -- :   
FATAL -- : ActionPolicy::Unauthorized (Not Authorized):
FATAL -- :   
FATAL -- : app/controllers/topics_suggest_controller.rb:47:in `topic_load' 

Какой самый идиоматичный способ пропустить ведение журнала только тех исключений, которые перечислены в rescue_responses?

1 Ответ

0 голосов
/ 24 сентября 2018

Подход 1

Заманчиво удалить DebugExceptions промежуточное ПО из стека Rails приложения.

config/application.rb:

config.middleware.delete ActionDispatch::DebugExceptions

Проблема в том, что этоименно промежуточное программное обеспечение, которое определяет Rails, не может найти маршрут и в таких случаях выдает ActionController::RoutingError.Следовательно, если вы хотите отреагировать на это исключение в вашем exceptions_app, этот подход вам не нужен.

Продолжайте и используйте этот подход, если для вас нормально видеть статус HTTP 404 ипростой текстовый ответ Not found, когда маршрут не найден.

Подход 2

Обезьяна-патч или каким-то образом изменить ActionDispatch::DebugExceptions.Фактически, в 2013 году было предложено изменить поведение DebugExceptions, чтобы оно пропускало журналирование исключений, зарегистрированных в rescue_responses: 9343 , там есть пример кода.

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

lib/ext/suppress_exceptions.rb:

module Ext
  module SuppressExceptions
    private

    def log_error(_request, wrapper)
      exception = wrapper.exception
      return if ActionDispatch::ExceptionWrapper.rescue_responses.key? exception.class.name
      super
    end
  end
end

config/initializers/error_handling.rb:

require_dependency 'ext/suppress_exceptions'

ActiveSupport.on_load(:action_controller) do
  ActionDispatch::DebugExceptions.prepend Ext::SuppressExceptions
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...