Search code examples
ruby-on-railsrubyrescueraise

Why is this raise not rescued, and what will correct it so that it is?


I am trying to create my own StandardError exception, but I cannot seem to fire rescue_from with the raise. The error is raised but never rescued. I built a simple application to try it, as follows:

class ApplicationController < ActionController::Base

  protect_from_forgery with: :exception

  class ApplicationController::LocationInvalid < StandardError
  end

  rescue_from ApplicationController::LocationInvalid, with: :reset_it

  raise ApplicationController::LocationInvalid

  private

  def reset_it(exception)
    session.clear
    cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
    puts 'Reset it processed'
  end
end

When I wrap the raise in begin/rescue/end, it prints e as ApplicationController::LocationInvalid:

  begin
    raise ApplicationController::LocationInvalid
  rescue => e
    puts e
  end

Output:

Started GET "/" for 127.0.0.1 at 2015-08-21 15:19:32 -0400 ApplicationController::LocationInvalid

I've tried various forms of specifying the ApplicationController class and not with no change in the results...


Solution

  • According to source code of Rails https://github.com/rails/rails/blob/f62fb985b6a7b90872148f0786219c9cc94c9356/actionpack/lib/action_controller/metal/rescue.rb#L32

    rescue_with works only during process_action call but you are raising exception during class evaluation. Probably the easiest way how to test it is to create simple controller with some action and try to raise exception during that action and rescue_with should work.