Skip to content

Commit e7e9c49

Browse files
committed
Attach backtrace to MultipleErrors as well
1 parent ddfb0a9 commit e7e9c49

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

lib/concurrent/promises.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,9 @@ def exception(*args)
958958
raise Concurrent::Error, 'it is not rejected' unless rejected?
959959
reason = Array(internal_state.reason).flatten.compact
960960
if reason.size > 1
961-
Concurrent::MultipleErrors.new reason
961+
ex = Concurrent::MultipleErrors.new reason
962+
ex.set_backtrace(caller)
963+
ex
962964
else
963965
ex = reason[0].clone.exception(*args)
964966
ex.set_backtrace Array(ex.backtrace) + caller

spec/concurrent/edge/promises_spec.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,25 @@ def behaves_as_delay(delay, value)
468468
end
469469
expect(future(0, &body).run.reason.message).to eq '5'
470470
end
471+
472+
it 'can be risen when rejected' do
473+
future = rejected_future TypeError.new
474+
backtrace = caller; exception = raise future rescue $!
475+
expect(exception).to be_a TypeError
476+
expect(exception.backtrace[2..-1]).to eq backtrace
477+
478+
exception = TypeError.new
479+
exception.set_backtrace(first_backtrace = %W[/a /b /c])
480+
future = rejected_future exception
481+
backtrace = caller; exception = raise future rescue $!
482+
expect(exception).to be_a TypeError
483+
expect(exception.backtrace - exception.backtrace[3..4]).to eq(first_backtrace + backtrace)
484+
485+
future = rejected_future(TypeError.new) & rejected_future(TypeError.new)
486+
backtrace = caller; exception = raise future rescue $!
487+
expect(exception).to be_a Concurrent::MultipleErrors
488+
expect(exception.backtrace[2..-1]).to eq backtrace
489+
end
471490
end
472491

473492
describe 'interoperability' do

0 commit comments

Comments
 (0)