mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
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:
parent
8d015dff82
commit
f48bb1b4ad
2 changed files with 11 additions and 4 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue