Как определить, какой обработчик исключений 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