123456789_123456789_123456789_123456789_123456789_

Module: ActiveSupport::Rescuable

Relationships & Source Files
Namespace Children
Modules:
Extension / Inclusion / Inheritance Descendants
Included In:
::ActionController::Base, ::ActionController::Rescue, ::ActionController::StrongParameters, ActionMailer::DeliveryJob, ::ActionView::TestCase::TestController, ::ActiveJob::Base, ::ActiveJob::Execution, Rails::ApplicationController, Rails::InfoController, Rails::MailersController, Rails::WelcomeController
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Concern
Defined in: activesupport/lib/active_support/rescuable.rb

Overview

Rescuable module adds support for easier exception handling.

Class Method Summary

Instance Method Summary

DSL Calls

included

[ GitHub ]


11
12
13
14
# File 'activesupport/lib/active_support/rescuable.rb', line 11

included do
  class_attribute :rescue_handlers
  self.rescue_handlers = []
end

Instance Method Details

#handler_for_rescue(exception)

[ GitHub ]

  
# File 'activesupport/lib/active_support/rescuable.rb', line 85

def handler_for_rescue(exception)
  # We go from right to left because pairs are pushed onto rescue_handlers
  # as rescue_from declarations are found.
  _, rescuer = self.class.rescue_handlers.reverse.detect do |klass_name, handler|
    # The purpose of allowing strings in rescue_from is to support the
    # declaration of handler associations for exception classes whose
    # definition is yet unknown.
    #
    # Since this loop needs the constants it would be inconsistent to
    # assume they should exist at this point. An early raised exception
    # could trigger some other handler and the array could include
    # precisely a string whose corresponding constant has not yet been
    # seen. This is why we are tolerant to unknown constants.
    #
    # Note that this tolerance only matters if the exception was given as
    # a string, otherwise a NameError will be raised by the interpreter
    # itself when rescue_from CONSTANT is executed.
    klass = self.class.const_get(klass_name) rescue nil
    klass ||= klass_name.constantize rescue nil
    exception.is_a?(klass) if klass
  end

  case rescuer
  when Symbol
    method(rescuer)
  when Proc
    if rescuer.arity == 0
      Proc.new { instance_exec(&rescuer) }
    else
      Proc.new { |_exception| instance_exec(_exception, &rescuer) }
    end
  end
end

#rescue_with_handler(exception)

Tries to rescue the exception by looking up and calling a registered handler.

[ GitHub ]

  
# File 'activesupport/lib/active_support/rescuable.rb', line 78

def rescue_with_handler(exception)
  if handler = handler_for_rescue(exception)
    handler.arity != 0 ? handler.call(exception) : handler.call
    true # don't rely on the return value of the handler
  end
end