# module ActiveSupport::Rescuable::ClassMethods

### Public Instance Methods

rescue_from(*klasses, &block) click to toggle source

Rescue exceptions raised in controller actions.

`rescue_from` receives a series of exception classes or class names, and a trailing `:with` option with the name of a method or a Proc object to be called to handle them. Alternatively a block can be given.

Handlers that take one argument will be called with the exception, so that the exception can be inspected when dealing with it.

Handlers are inherited. They are searched from right to left, from bottom to top, and up the hierarchy. The handler of the first class for which `exception.is_a?(klass)` holds true is the one invoked, if any.

    class ApplicationController < ActionController::Base
      rescue_from User::NotAuthorized, :with => :deny_access # self defined exception
      rescue_from ActiveRecord::RecordInvalid, :with => :show_errors

      rescue_from 'MyAppError::Base' do |exception|
        render :xml => exception, :status => 500
      end

      protected
        def deny_access
          ...
        end

        def show_errors(exception)
          exception.record.new_record? ? ...
        end
    end

    # File lib/active_support/rescuable.rb, line 51
    def rescue_from(*klasses, &block)
      options = klasses.extract_options!

      unless options.has_key?(:with)
        if block_given?
          options[:with] = block
        else
          raise ArgumentError, "Need a handler. Supply an options hash that has a :with key as the last argument."
        end
      end

      klasses.each do |klass|
        key = if klass.is_a?(Class) && klass <= Exception
          klass.name
        elsif klass.is_a?(String)
          klass
        else
          raise ArgumentError, "#{klass} is neither an Exception nor a String"
        end

        # put the new handler at the end because the list is read in reverse
        self.rescue_handlers += [[key, options[:with]]]
      end
    end