Feature #20275
closedAvoid extra backtrace entries for rescue and ensure
Description
From https://bugs.ruby-lang.org/issues/19117#note-48:
def raise_nested_exceptions
raise "First error"
rescue
begin
raise "Second error"
rescue
raise "Third error"
end
end
raise_nested_exceptions
Current:
-:7:in 'Object#raise_nested_exceptions': Third error (RuntimeError)
from -:4:in 'Object#raise_nested_exceptions'
from -:1:in 'Object#raise_nested_exceptions'
from -:11:in '<main>'
-:5:in 'Object#raise_nested_exceptions': Second error (RuntimeError)
from -:1:in 'Object#raise_nested_exceptions'
from -:11:in '<main>'
-:2:in 'Object#raise_nested_exceptions': First error (RuntimeError)
from -:11:in '<main>'
The above repeated backtrace entries for Object#raise_nested_exceptions
are because of CRuby implementation details.
It seems best to hide them because they do not help understanding the program, and semantically there is no (method or proc) call on line 1 or 4.
Proposed:
-:7:in 'Object#raise_nested_exceptions': Third error (RuntimeError)
from -:11:in '<main>'
-:5:in 'Object#raise_nested_exceptions': Second error (RuntimeError)
from -:11:in '<main>'
-:2:in 'Object#raise_nested_exceptions': First error (RuntimeError)
from -:11:in '<main>'
We can see TruffleRuby and JRuby already behave this way, most likely because they do not use an extra frame for rescue
.
It is definitely useful to have the same backtrace on different Ruby implementations as some tests rely on this.
TruffleRuby 23.1.2:
-:7:in `raise_nested_exceptions': Third error (RuntimeError)
from -:11:in `<main>'
-:5:in `raise_nested_exceptions': Second error (RuntimeError)
from -:11:in `<main>'
-:2:in `raise_nested_exceptions': First error (RuntimeError)
from -:11:in `<main>'
JRuby 9.4.5.0:
RuntimeError: Third error
raise_nested_exceptions at -:7
<main> at -:11
RuntimeError: Second error
raise_nested_exceptions at -:5
<main> at -:11
RuntimeError: First error
raise_nested_exceptions at -:2
<main> at -:11
Updated by Eregon (Benoit Daloze) 9 months ago
- Related to Feature #19117: Include the method owner in backtraces, not just the method name added
Updated by Eregon (Benoit Daloze) 9 months ago
Same thing for ensure
:
begin
raise
ensure
p caller(0)
end
On CRuby master:
["-:4:in '<main>'", "-:4:in '<main>'"]
On CRuby 3.2:
["-:4:in `ensure in <main>'", "-:4:in `<main>'"]
Proposed:
["-:4:in '<main>'"]
Already the case on TruffleRuby and JRuby (except the quotes which have not changed yet of course):
["-:4:in `<main>'"]
Updated by mame (Yusuke Endoh) 9 months ago
- Assignee set to ko1 (Koichi Sasada)
Updated by ko1 (Koichi Sasada) 9 months ago
- Assignee changed from ko1 (Koichi Sasada) to matz (Yukihiro Matsumoto)
I don't have any opinion so I leave it on Matz.
Updated by matz (Yukihiro Matsumoto) 8 months ago
I agree with removing ensure in
and rescue in
entries from backtraces.
Matz.
Updated by headius (Charles Nutter) 8 months ago
JRuby also does not have a separate frame for rescues and ensures and we support removing these entries from backtraces.
Updated by mame (Yusuke Endoh) 8 months ago
I am in favor of this change, but I do not plan to write a patch and estimate its impact. Someone who wants this, please do it.
I recommend doing this earlier. Since it is incompatible, it may be too late closer to the upcoming release.
Updated by Eregon (Benoit Daloze) 8 months ago
- Assignee changed from matz (Yukihiro Matsumoto) to Eregon (Benoit Daloze)
Updated by Eregon (Benoit Daloze) 8 months ago
- Status changed from Open to Closed
Applied in changeset git|74995a1a772903c5247886da1105caa27a4afa2d.
[Feature #20275] Remove extra backtrace entries for rescue and ensure