rescue_fromの走査は下から上だった。

  • 46
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

どうも思った通りにrescue_fromが例外を捕まえないと思ったら、下記だった。

http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html

They are searched from right to left, from bottom to top, and up the hierarchy.

右から左、下から上へ、そして継承を遡って検索される。

ずっとこの辺りのコードを弄っていなかったのだが、なぜ今まで想定通りに動いていたのだろうか…謎だ。

class ApplicationController < ActionController::Base

  # ...

  # ハンドルしきれなかったエラーは500エラー扱い
  # 評価は右から左、下から上へなされるのでこの場所で良い。
  # @see http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html
  rescue_from Exception, :with => :render_500

  # その他細々したエラーをハンドル
  rescue_from ActionController::RoutingError, ActiveRecord::RecordNotFound, :with => :render_404
  rescue_from ActiveRecord::RecordNotUnique, :with => :render_409
  rescue_from UnauthorizedError, :with => :render_401
  rescue_from IllegalAccessError, :with => :render_403

  # 500エラーのハンドラ
  def render_500(exception = nil)
    handle_error(exception , 500)
  end

  # ... 他のエラーのハンドラも作る

end