考虑一下这个begin-rescue-ensure块:
attempts=0
begin
make_service_call()
rescue Exception
retry unless attempts>2
exit -1
ensure
attemps += 1
end
Run Code Online (Sandbox Code Playgroud)
如果按原样运行该代码,则会引发异常,因为没有名为'make_service_call()'的函数.所以,它重试了.但它会陷入无限循环,因为控件永远不会因为"重试"而"确保".不应该'确保'块的一部分确保其中的代码无论在'begin'或'rescue'中发生什么都会被执行?
当然,我可以在'开始'中增加计数 - 这不是重点.我只想问一下'确保'的问题,以便澄清一下.
mu *_*ort 18
该ensure部分在离开begin语句时执行(通过任何方式),但是当你retry,你只是在语句内部移动,因此不会执行ensure部分.
试试这个版本的示例,以便更好地了解正在发生的事情:
attempts = 0
begin
make_service_call()
rescue Exception
attempts += 1
retry unless attempts > 2
exit -1
ensure
puts "ensure! #{attempts}"
end
Run Code Online (Sandbox Code Playgroud)