raise overwrites exception cause even if exception is not new
It appears that
raise will overwrite the original cause of an exception even when re-raising the same one. I believe this is a bug, since loses the original cause and associates the re-raised exception with a completely unrelated cause.
begin begin raise 'a' rescue => a begin raise 'b' rescue => b p [b, b.cause] begin raise 'c' rescue raise b end end end rescue p [$!, $!.cause] end
 ~/projects/jruby $ ruby23 cause.rb [#<RuntimeError: b>, #<RuntimeError: a>] [#<RuntimeError: b>, #<RuntimeError: c>]
Here, the original cause of the "b" exception (the "a" exception) is lost, replaced during the re-raise with the "c" exception.
I believe JRuby 22.214.171.124's behavior is correct here:
 ~/projects/jruby $ rvm jruby-126.96.36.199 do ruby cause.rb [#<RuntimeError: b>, #<RuntimeError: a>] [#<RuntimeError: b>, #<RuntimeError: a>]
Updated by nobu (Nobuyoshi Nakada) over 6 years ago
cause is set just in
$ jruby -v -e 'raise "a" rescue p RuntimeError.new("b").cause' jruby 188.8.131.52-SNAPSHOT (2.2.3) 2016-02-14 c08ca7a Java HotSpot(TM) 64-Bit Server VM 25.25-b02 on 1.8.0_25-b17 +jit [darwin-x86_64] #<RuntimeError: a>
$ ruby -v -e 'raise "a" rescue p RuntimeError.new("b").cause' ruby 2.4.0dev (2016-02-13 trunk 53817) [universal.x86_64-darwin15] nil
Updated by nagachika (Tomoyuki Chikanaga) over 6 years ago
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN to 2.0.0: DONTNEED, 2.1: REQUIRED, 2.2: REQUIRED, 2.3: REQUIRED
Please don't backport to the stable branches by yourself. The branch maintainers (usa and me) will do.
I fill Backport field.
I don't think the existing application depend on this behavior. Any opinions?