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
Concern - Extended
Instance Method Summary
- #handler_for_rescue(exception)
-
#rescue_with_handler(exception)
Tries to rescue the exception by looking up and calling a registered handler.
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.
# 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