17 votes

Comment déterminer quel gestionnaire d'exception rescue_from choisira dans Rails ?

J'ai deux gestionnaires rescue_from, un gestionnaire 404, et un gestionnaire catch all. Le catch all est toujours appelé pour les exceptions ActiveRecord::RecordNotFound et le gestionnaire 404 n'est jamais appelé. Je m'attendais à ce que le gestionnaire le plus spécifique soit appelé mais cela ne se produit pas.

application_controller.rb

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

# Gérer toutes les exceptions non gérées
rescue_from Exception do |e|
  ...
end

Les docs api pour rescue_from disent ce qui suit:

Les gestionnaires sont hérités. Ils sont recherchés de droite à gauche, de bas en haut, et dans la hiérarchie. Le gestionnaire de la première classe pour laquelle exception.is_a?(klass) est vrai est celui invoqué, s'il y en a.

Est-ce que j'interprète mal la déclaration ci-dessus. Comment obtenir le comportement que je recherche?

24voto

Brian Bice Points 246

Le gestionnaire 404 n'est jamais appelé car le gestionnaire de capture tout est toujours appelé en premier dans votre exemple. Le problème se trouve dans l'ordre des définitions de gestionnaire. Elles sont évaluées de bas en haut, ce qui signifie que votre gestionnaire défini en dernier aura la priorité la plus élevée et votre premier gestionnaire défini aura la priorité la plus basse. Si vous inversez l'ordre, vous obtiendrez le comportement que vous souhaitez.

# Attraper toutes les exceptions non gérées
rescue_from StandardError do |e|
  ...
end

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X