[#82706] [Ruby trunk Bug#13851] getting "can't modify string; temporarily locked" on non-frozen instances — cardoso_tiago@...
Issue #13851 has been updated by chucke (Tiago Cardoso).
3 messages
2017/09/07
[#82853] [Ruby trunk Bug#13916] Race condition when sending a signal to a new fork — russell.davis@...
Issue #13916 has been reported by russelldavis (Russell Davis).
3 messages
2017/09/19
[#82892] [Ruby trunk Bug#13921] buffered read_nonblock doesn't work as expected using SSLSocket — cardoso_tiago@...
Issue #13921 has been updated by chucke (Tiago Cardoso).
3 messages
2017/09/20
[ruby-core:82936] [Ruby trunk Bug#13930] Exception is caught in rescue above ensure
From:
michisauter@...
Date:
2017-09-22 14:31:36 UTC
List:
ruby-core #82936
Issue #13930 has been reported by msauter (Michael Sauter).
----------------------------------------
Bug #13930: Exception is caught in rescue above ensure
https://bugs.ruby-lang.org/issues/13930
* Author: msauter (Michael Sauter)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
Given the following code:
~~~ ruby
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
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.
If I change the code to this:
~~~ ruby
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
ensure outside
default@pjpp:/pjpp$ ruby foo.rb
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.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>