class ActionDispatch::ShowExceptions - actionpack-4.2.4 Documentation

# class ActionDispatch::ShowExceptions

This middleware rescues any exception returned by the application and calls an exceptions app that will wrap it in a format for the end user.

The exceptions app should be passed as parameter on initialization of ShowExceptions. Every time there is an exception, ShowExceptions will store the exception in env, rewrite the PATH_INFO to the exception status code and call the rack app.

If the application returns a “X-Cascade” pass response, this middleware will send an empty response as result with the correct status code. If any exception happens inside the exceptions app, this middleware catches the exceptions and returns a FAILSAFE_RESPONSE.

### Constants

FAILSAFE_RESPONSE

### Public Class Methods

new(app, exceptions_app) click to toggle source

    # File lib/action_dispatch/middleware/show_exceptions.rb, line 24
    def initialize(app, exceptions_app)
      @app = app
      @exceptions_app = exceptions_app
    end

### Public Instance Methods

call(env) click to toggle source

    # File lib/action_dispatch/middleware/show_exceptions.rb, line 29
    def call(env)
      @app.call(env)
    rescue Exception => exception
      if env['action_dispatch.show_exceptions'] == false
        raise exception
      else
        render_exception(env, exception)
      end
    end

### Private Instance Methods

pass_response(status) click to toggle source

    # File lib/action_dispatch/middleware/show_exceptions.rb, line 54
    def pass_response(status)
      [status, {"Content-Type" => "text/html; charset=#{Response.default_charset}", "Content-Length" => "0"}, []]
    end

render_exception(env, exception) click to toggle source

    # File lib/action_dispatch/middleware/show_exceptions.rb, line 41
    def render_exception(env, exception)
      wrapper = ExceptionWrapper.new(env, exception)
      status  = wrapper.status_code
      env["action_dispatch.exception"] = wrapper.exception
      env["action_dispatch.original_path"] = env["PATH_INFO"]
      env["PATH_INFO"] = "/#{status}"
      response = @exceptions_app.call(env)
      response[1]['X-Cascade'] == 'pass' ? pass_response(status) : response
    rescue Exception => failsafe_error
      $stderr.puts "Error during failsafe response: #{failsafe_error}\n  #{failsafe_error.backtrace * "\n  "}"
      FAILSAFE_RESPONSE
    end