Module: ActiveSupport::Rescuable
- Defined in:
- lib/active_support/rescuable.rb
Overview
Rescuable module adds support for easier exception handling.
Defined Under Namespace
Modules: ClassMethods
Class Method Summary collapse
-
.included(base) ⇒ Object
:nodoc:.
Instance Method Summary collapse
- #handler_for_rescue(exception) ⇒ Object
-
#rescue_with_handler(exception) ⇒ Object
Tries to rescue the exception by looking up and calling a registered handler.
Class Method Details
.included(base) ⇒ Object
:nodoc:
4 5 6 7 8 9 |
# File 'lib/active_support/rescuable.rb', line 4 def self.included(base) # :nodoc: base.class_inheritable_accessor :rescue_handlers base.rescue_handlers = [] base.extend(ClassMethods) end |
Instance Method Details
#handler_for_rescue(exception) ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/active_support/rescuable.rb', line 78 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 = Array(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 rescuer.bind(self) end end |
#rescue_with_handler(exception) ⇒ Object
Tries to rescue the exception by looking up and calling a registered handler.
71 72 73 74 75 76 |
# File 'lib/active_support/rescuable.rb', line 71 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 |