Глобальная обработка ошибок и порядок включения rescue_from - PullRequest
2 голосов
/ 31 октября 2019

Чтобы моя программа работала как положено, порядок rescue_from не интуитивно понятен. Мне интересно, почему это происходит или где я ошибаюсь?

Я пробовал это решение для обработки ошибок.

https://medium.com/rails-ember-beyond/error-handling-in-rails-the-modular-way-9afcddd2fe1b#.yvuf06281

Мой обработчик ошибок был таким жекак в github repo

module Error
  module ErrorHandler
    def self.included(clazz)
      clazz.class_eval do
        rescue_from ActiveRecord::RecordNotFound do |e|
          respond(:record_not_found, 404, e.to_s)
        end
        rescue_from CustomError do |e|
          respond(e.error, e.status, e.message.to_s)
        end
        rescue_from StandardError do |e|
          respond(:standard_error, 500, e.to_s)
        end
      end
    end

Это приводит к тому, что мои ошибки всегда обнаруживаются в блоке StandardError, пропуская блоки ошибок ActiveRecord::RecordNotFound и Custom.

Однако, если я переключаю порядок (StandardError выше в исполнении), он правильно перехватывает другие типы ошибок.

    def self.included(clazz) #includes module as a class method
      clazz.class_eval do
        rescue_from StandardError do |e|
          respond(:standard_error, 500, e.to_s) 
        end

        rescue_from ActiveRecord::RecordNotFound do |e|
          respond(:record_not_found, 404, e.to_s)
        end

        rescue_from CustomError do |e|
          respond(e.error, e.status, e.message.to_s)
        end
      end
    end

Почему работает StandardError наверху?

1 Ответ

2 голосов
/ 31 октября 2019

Последний объявленный обработчик имеет наивысший приоритет , поэтому сначала необходимо объявить общие обработчики (например, один для StandardError), а затем конкретные.

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