Method: ActiveSupport::Rescuable::ClassMethods#rescue_with_handler

Defined in:
lib/active_support/rescuable.rb

#rescue_with_handler(exception, object: self, visited_exceptions: []) ⇒ Object

Matches an exception to a handler based on the exception class.

If no handler matches the exception, check for a handler matching the (optional) exception.cause. If no handler matches the exception or its cause, this returns nil, so you can deal with unhandled exceptions. Be sure to re-raise unhandled exceptions if this is what you expect.

begin
  # ...
rescue => exception
  rescue_with_handler(exception) || raise
end

Returns the exception if it was handled and nil if it was not.



90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/active_support/rescuable.rb', line 90

def rescue_with_handler(exception, object: self, visited_exceptions: [])
  visited_exceptions << exception

  if handler = handler_for_rescue(exception, object: object)
    handler.call exception
    exception
  elsif exception
    if visited_exceptions.include?(exception.cause)
      nil
    else
      rescue_with_handler(exception.cause, object: object, visited_exceptions: visited_exceptions)
    end
  end
end