我有两个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)成立的是被调用的那个
任何。
我是否错误地解释了关于陈述的陈述。我如何获得我正在寻找的行为?
永远不会调用404处理程序,因为在示例中始终首先调用catch all。问题在于处理程序定义的排序。它们从下到上进行评估,这意味着您最后定义的处理程序将具有最高优先级,并且您的第一个定义的处理程序将具有最低优先级。如果您切换订单,那么您将获得所需的行为。
# Catch all unhandled exceptions
rescue_from Exception do |e|
...
end
# ActiveRecord 404
rescue_from ActiveRecord::RecordNotFound do |e|
...
end
永远不会调用404处理程序,因为在示例中始终首先调用catch all。问题在于处理程序定义的排序。它们从下到上进行评估,这意味着您最后定义的处理程序将具有最高优先级,并且您的第一个定义的处理程序将具有最低优先级。如果您切换订单,那么您将获得所需的行为。
# Catch all unhandled exceptions
rescue_from Exception do |e|
...
end
# ActiveRecord 404
rescue_from ActiveRecord::RecordNotFound do |e|
...
end