2012-02-02 10 views
11

私は2つのrescue_fromハンドラ、404ハンドラ、およびcatch allハンドラを持っています。 catchは常にActiveRecord :: RecordNotFound例外を呼び出され、404ハンドラは呼び出されません。私の期待は、より具体性の高いハンドラが呼び出されることですが、これは起こりません。Railsでrescue_fromが選択する例外ハンドラはどれですか?

application_controller.rb

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

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

api docs for rescue_fromは、次の言葉:

ハンドラが継承されています。それらは、右から左へ、 の下から上へ、そして階層の上から検索されます。 exception.is_a?(klass)がtrueの最初のクラス のハンドラは、 anyのいずれかが呼び出された場合に呼び出されます。

私はaboutステートメントを間違って解釈していますか?私が探している行動をどうやって得るのですか?

答えて

13

404ハンドラが呼び出されることはありません。なぜなら、あなたの例では、catchが常に最初に呼び出されるからです。問題はハンドラ定義の順序にあります。これらは下から上へと評価され、最後に定義されたハンドラが最も高い優先度を持ち、最初に定義されたハンドラが最も低い優先度を持つことを意味します。あなたが注文を切り替えると、あなたが望む動作が得られます。

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

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

これまでも私はそれを試しても機能していないように見えましたが、今はそうです。ありがとう。 –

+2

私は他のすべての例外の神の母であるので、決して '例外 'を救出することを勧めません。これはあなたの構文エラーなどを救済するでしょう。 – Hendrik

+1

StandardErrorはcatch-allクラスです。 – Duke

関連する問題