Как определить, какой обработчик исключений rescue_from выберет в Rails? - PullRequest
14 голосов
/ 02 февраля 2012

У меня есть два обработчика rescue_from, обработчик 404 и обработчик catch all.Функция catch all всегда вызывается для исключений 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 для rescue_from говорят о следующем:по наследству.Они ищутся справа налево, снизу вверх и вверх по иерархии.Обработчик первого класса, для которого true.is_a? (Klass) имеет значение true, вызывается, если таковой имеется.

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

1 Ответ

21 голосов
/ 03 февраля 2012

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

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

# ActiveRecord 404
rescue_from ActiveRecord::RecordNotFound do |e|
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...