[#105450] [Ruby master Feature#18228] Add a `timeout` option to `IO.copy_stream` — "byroot (Jean Boussier)" <noreply@...>
SXNzdWUgIzE4MjI4IGhhcyBiZWVuIHJlcG9ydGVkIGJ5IGJ5cm9vdCAoSmVhbiBCb3Vzc2llciku
11 messages
2021/09/27
[ruby-core:105320] [Ruby master Bug#14479] Exceptions raised from a :call tracepoint can sometimes be "rescued" inside the method
From:
"ko1 (Koichi Sasada)" <noreply@...>
Date:
2021-09-17 06:09:09 UTC
List:
ruby-core #105320
Issue #14479 has been updated by ko1 (Koichi Sasada).
Status changed from Open to Rejected
I want to reject this issue because of the following reasons:
* TracePoint block shouldn't raise an exception. TracePoint should not hurt non-hook (99.99..% case) execution if possible. I don't think this difference is not a matter.
* Now Ruby 2.4 is obsolete version (current last supported version is Ruby 2.6), so it also the change from stable versions if it was changed. I propose to change the definition of `call` event is "It invokes just before the first line in a method" from Ruby 2.4.
```
def foo
# invoike here before 2.4
begin
# invoke here from 2.5
foo
rescue
...
end
end
```
Please reopen this issue if it is needed.
----------------------------------------
Bug #14479: Exceptions raised from a :call tracepoint can sometimes be "rescued" inside the method
https://bugs.ruby-lang.org/issues/14479#change-93735
* Author: dazuma (Daniel Azuma)
* Status: Rejected
* Priority: Normal
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
This is a Ruby 2.5 regression.
If you raise an exception from a :call tracepoint, it can, in certain circumstances, be caught by a rescue block inside the called method. Here is an illustration:
```
def foo
begin
puts "hi"
rescue => e
puts "In rescue"
end
end
TracePoint.trace :call do |tp|
raise "kaboom" if tp.method_id == :foo
end
foo
```
In Ruby 2.4.3, this results in the exception as expected.
In Ruby 2.5.0, this results in "in rescue" being printed to the console. The rescue block inside method "foo" is catching the exception.
This is highly dependent on the positioning of the rescue block in the method, and may be related to which bytecode is flagged with the trace flag. For example, the following method "foo" raises the exception in Ruby 2.5.0:
```
def foo
puts "hi"
begin
puts "hi"
rescue => e
puts "In rescue"
end
end
```
Here are three more interesting variants that should be considered:
```
def foo
if true
begin
puts "hi"
rescue => e
puts "In rescue"
end
end
end
```
Prints "in rescue"
```
def foo
if false
begin
puts "hi"
rescue => e
puts "In rescue"
end
end
end
```
Raises the exception
```
def foo
if false
begin
puts "hi"
rescue => e
puts "In rescue"
end
end
1
end
```
Segfaults!
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>