Actions
Bug #13930
closedException is caught in rescue above ensure
Description
Given the following code:
def foo
i = 0
3.times do |n|
begin
puts "a"
i += 1
next if i > 1
puts "b"
rescue => e
puts "rescue in foo, caught #{e}"
ensure
puts "ensure in foo, yield from foo: #{n}"
yield n
end
end
end
begin
x = 0
foo do |o|
puts o
x += 1
raise "test" if x > 1
puts "done yielding"
end
rescue => e
puts "rescue outside, caught #{e}"
ensure
puts "ensure outside"
end
The output is:
a
b
ensure in foo, yield from foo: 0
0
done yielding
a
ensure in foo, yield from foo: 1
1
rescue in foo, caught test
ensure in foo, yield from foo: 1
1
rescue outside, caught test
ensure outside
So the exception raised within the yielded block is caught in the rescue block above the ensure block which yielded. That sounds wrong to me. Or is it intended? The issue seems to be with the usage of next. Also, exception is caught inside AND outside as it seems that the ensure block ends up being called twice ?!
If I change the code to this:
def foo
i = 0
3.times do |n|
begin
puts "a"
i += 1
# next if i > 1
puts "b"
rescue => e
puts "rescue in foo, caught #{e}"
ensure
puts "ensure in foo, yield from foo: #{n}"
yield n
end
end
end
begin
x = 0
foo do |o|
puts o
x += 1
raise "test" if x > 1
puts "done yielding"
end
rescue => e
puts "rescue outside, caught #{e}"
ensure
puts "ensure outside"
end
Then the output is:
a
b
ensure in foo, yield from foo: 0
0
done yielding
a
b
ensure in foo, yield from foo: 1
1
rescue outside, caught test
ensure outside
I would have expected this output also when using next as above.
Files
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0