Before block is run twice when an error occurs #818

Closed
Wardrop opened this Issue Mar 30, 2012 · 3 comments

3 participants

@Wardrop

When an exception occurs, the before blocks are run a second time before the error block is called. It's like the full request cycle is being invoked when an error occurs. This only seems to apply to exceptions. Calls to halt do not cause the error blocks to be re-run.

Is this the intended behavior, and if so, in what scenario is this behavior desirable?

Edit: I should add that I'm using 0.10.5 as I've got another issue open regarding a problem encountered while upgrading to 0.10.6.

@dariocravero
Padrino Framework member

Yes, you're right, it does happen like that and still happens in both 0.10.7 and edge. Same thing happens on Sinatra.

Test code:

  error 500 do
    'error 500'
  end

  before do
    puts 'before'                                                                                                                                                                    
  end

  get :index do
    raise Exception, "Oops"
  end

or jist it with curl -L http://jister.uxtemple.com | `which bash` -s 57c7415df6c0bbbd0e0d ;)

Will dig deeper and see what happens. Have a feeling it might be connected to #931.

@ujifgc
Padrino Framework member

The issue is related to #591

    def dispatch!
      static! if settings.static? && (request.get? || request.head?)
      route!
    rescue ::Exception => boom
      filter! :before #here is the second call for filters
      handle_exception!(boom)
    ensure
      filter! :after unless env['sinatra.static_file']
    end
@ujifgc ujifgc added a commit to ujifgc/padrino-framework that referenced this issue Jan 10, 2013
@ujifgc ujifgc fixing #818, respecting #591, adding a test 560c949
@dariocravero
Padrino Framework member

Confirmed it fixes it. Thanks @ujifgc!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment