这是一个片段
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
有原因的:它总是运行。好吧,事实证明我错了。
在我们讨论的时候:你知道这个领域的其他问题(异常处理)吗?