Project

General

Profile

Feature #20275

Updated by Eregon (Benoit Daloze) 10 months ago

From https://bugs.ruby-lang.org/issues/19117#note-48: 
 ```ruby 
 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 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 lots of 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 
 ```

Back