问题 如何确定rescue_from将在Rails中选择哪个异常处理程序?


我有两个rescue_from处理程序,一个404处理程序和一个catch all处理程序。始终会调用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

用于rescue_from的api文档 说如下:

处理程序是继承的。从右到左搜索它们   从下到上,以及层次结构。第一类的处理程序   如果是,则exception.is_a?(klass)成立的是被调用的那个   任何。

我是否错误地解释了关于陈述的陈述。我如何获得我正在寻找的行为?


3887
2018-02-02 19:58


起源



答案:


永远不会调用404处理程序,因为在示例中始终首先调用catch all。问题在于处理程序定义的排序。它们从下到上进行评估,这意味着您最后定义的处理程序将具有最高优先级,并且您的第一个定义的处理程序将具有最低优先级。如果您切换订单,那么您将获得所需的行为。

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

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

15
2018-02-02 22:35



我之前甚至尝试过它,它似乎没有用,但现在确实如此。谢谢。 - Tim Santeford
我建议永远不要救援 Exception 因为它是所有其他例外的上帝之母。这甚至可以解决您的语法错误或其他问题。 - Hendrik
StandardError将是catch-all类。 - Duke


答案:


永远不会调用404处理程序,因为在示例中始终首先调用catch all。问题在于处理程序定义的排序。它们从下到上进行评估,这意味着您最后定义的处理程序将具有最高优先级,并且您的第一个定义的处理程序将具有最低优先级。如果您切换订单,那么您将获得所需的行为。

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

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

15
2018-02-02 22:35



我之前甚至尝试过它,它似乎没有用,但现在确实如此。谢谢。 - Tim Santeford
我建议永远不要救援 Exception 因为它是所有其他例外的上帝之母。这甚至可以解决您的语法错误或其他问题。 - Hendrik
StandardError将是catch-all类。 - Duke