Как определить, какой обработчик исключений rescue_from будет выбран в Rails?

У меня есть два обработчика rescue_from, обработчик 404 и обработчик catch. Уловка всегда получает вызовы для исключений ActiveRecord:: RecordNotFound, и обработчик 404 никогда не вызывается. Я ожидаю, что обработчик с большей спецификой будет вызван, но этого не произойдет.

application_controller.rb

# ActiveRecord 404
rescue_from ActiveRecord::RecordNotFound do |e|
  ...
end

# Catch all unhandled exceptions
rescue_from Exception do |e|
  ...
end

api docs для rescue_from говорит следующее:

Обработчики наследуются. Их обыскивают справа налево, от вверху вверх и вверх по иерархии. Обработчик первого класса для которого true.is_a? (klass) имеет значение true, это тот, который вызывается, если любой.

Я неправильно интерпретирую выражение. Как получить поведение, которое я ищу?

Ответ 1

Обработчик 404 никогда не будет вызван, потому что catch всегда будет вызван первым в вашем примере. Проблема заключается в упорядочении определений обработчиков. Они оцениваются снизу вверх, что означает, что ваш последний определенный обработчик будет иметь наивысший приоритет, а ваш первый определенный обработчик будет иметь самый низкий приоритет. Если вы измените порядок, вы получите нужное поведение.

# Catch all unhandled exceptions
rescue_from Exception do |e|
  ...
end

# ActiveRecord 404
rescue_from ActiveRecord::RecordNotFound do |e|
  ...
end