Project

General

Profile

Bug #13043

Updated by nobu (Nobuyoshi Nakada) over 7 years ago

In a certain situation, Exception#cause can become an infinite list: 

 ```ruby 
 ``` 

 def raise_errors 
   begin 
     raise "error 1" 
   ensure 
      orig_error = $! 
      begin 
        raise "error 2" 
      rescue => err 
        raise orig_error || err 
      end 
   end 
 end 

 x = nil 
 begin 
   raise_errors 
 rescue 
   x = $! 
 end 

 x.cause.cause.object_id == x.object_id 
 ``` 

 Note that this pattern happened during an HTTP request with net/http: see https://github.com/ruby/ruby/blob/v2_3_1/lib/net/http/response.rb#L261.    I would expect that x would be "error 2", x.cause would be "error 1", and x.cause.cause would be nil. Instead an infinite loop forms, breaking error reporting code that loops over an exception's cause

Back