Call fallback exception handlers with the right exception

The issue presented in #26246 showed a deeper underlying problem. When
we fell back to the exception handler for an exceptions cause, we were
calling that handler with the outer raised exception. This breaks the
calling code's expectations, especially if the exception has methods on
it behond those from `StandardError`.
This commit is contained in:
Sean Griffin 2016-11-17 14:49:07 -05:00
parent 8d015dff82
commit f48bb1b4ad
2 changed files with 11 additions and 4 deletions

View File

@ -85,14 +85,16 @@ module ActiveSupport
#
# Returns the exception if it was handled and +nil+ if it was not.
def rescue_with_handler(exception, object: self)
if handler = handler_for_rescue(exception, object: object)
handler, exception = handler_for_rescue(exception, object: object)
if handler
handler.call exception
exception
end
end
def handler_for_rescue(exception, object: self) #:nodoc:
case rescuer = find_rescue_handler(exception)
rescuer, exception = find_rescue_handler(exception)
result = case rescuer
when Symbol
method = object.method(rescuer)
if method.arity == 0
@ -107,6 +109,7 @@ module ActiveSupport
-> e { object.instance_exec(e, &rescuer) }
end
end
[result, exception]
end
private
@ -121,7 +124,11 @@ module ActiveSupport
end
end
handler || find_rescue_handler(exception.cause)
if handler
[handler, exception]
else
find_rescue_handler(exception.cause)
end
end
end

View File

@ -137,6 +137,6 @@ class RescuableTest < ActiveSupport::TestCase
def test_rescue_falls_back_to_exception_cause
@stargate.dispatch :fall_back_to_cause
assert_equal "unhandled RuntimeError with a handleable cause", @stargate.result
assert_equal "dex", @stargate.result
end
end