当我''救援''重试'时,Ruby不会'确保'

har*_*ski 10 ruby rescue

考虑一下这个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)