Posted at

Ruby の ensure が実行される条件のメモ

More than 1 year has passed since last update.

rescue 節内で raise したときに ensure が実行されるのかされないのか、いつも思い出せないのでメモっておく

(下記の irb を実行するのはもう4回目くらいになると思う)

実行したのは

$ ruby -v

ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]

です。

irb(main):016:0> begin

irb(main):017:1* raise "a"
irb(main):018:1> rescue => e
irb(main):019:1> puts "in rescue"
irb(main):020:1> raise
irb(main):021:1> ensure
irb(main):022:1* puts "in ensure"
irb(main):023:1> end
in rescue
in ensure
RuntimeError: a
from (irb):17
from /usr/bin/irb:11:in `<main>'

これを見るに、rescue 節で raise すると、 ensure を通りつつ例外があがっていくようである。