これがスニペットです
def take_resource
puts "resource taken"
end
def free_resource source
puts "resource freed from #{source}"
end
def do_stuff
tries = 0
begin
take_resource
raise 'oops'
rescue
if tries < 3
tries += 1
free_resource 'rescue'
retry
end
raise
ensure
free_resource 'ensure'
end
end
do_stuff
# ~> -:13:in `do_stuff': oops (RuntimeError)
# ~> from -:28:in `<main>'
# >> resource taken
# >> resource freed from rescue
# >> resource taken
# >> resource freed from rescue
# >> resource taken
# >> resource freed from rescue
# >> resource taken
# >> resource freed from ensure
ここでは、ブロックensure
するときに句が呼び出されないことがわかります。retry
何故ですか?これには論理的な説明がありますか?私はそれが理由ensure
で呼ばれていると思いました:それは常に実行されます。ensure
さて、私が間違っていたことがわかりました。
そして、私たちがそれに取り組んでいる間、あなたはこの分野の他の落とし穴(例外処理)について知っていますか?