Project

General

Profile

Actions

Feature #20275

closed

Avoid extra backtrace entries for rescue and ensure

Added by Eregon (Benoit Daloze) 2 months ago. Updated about 1 month ago.

Status:
Closed
Target version:
[ruby-core:116819]

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

Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #19117: Include the method owner in backtraces, not just the method nameClosedmame (Yusuke Endoh)Actions
Actions #1

Updated by Eregon (Benoit Daloze) 2 months ago

  • Related to Feature #19117: Include the method owner in backtraces, not just the method name added

Updated by Eregon (Benoit Daloze) 2 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>'"]
Actions #3

Updated by Eregon (Benoit Daloze) 2 months ago

  • Description updated (diff)

Updated by mame (Yusuke Endoh) 2 months ago

  • Assignee set to ko1 (Koichi Sasada)
Actions #5

Updated by Eregon (Benoit Daloze) 2 months ago

  • Description updated (diff)

Updated by ko1 (Koichi Sasada) 2 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) 2 months ago

I agree with removing ensure in and rescue in entries from backtraces.

Matz.

Updated by headius (Charles Nutter) about 2 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) about 2 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) about 1 month ago

  • Assignee changed from matz (Yukihiro Matsumoto) to Eregon (Benoit Daloze)
Actions #11

Updated by Eregon (Benoit Daloze) about 1 month ago

  • Status changed from Open to Closed

Applied in changeset git|74995a1a772903c5247886da1105caa27a4afa2d.


[Feature #20275] Remove extra backtrace entries for rescue and ensure

Actions #12

Updated by Eregon (Benoit Daloze) about 1 month ago

  • Target version set to 3.4
Actions

Also available in: Atom PDF

Like3
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0