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