Ruby does not 'ensure' when I 'retry' in 'rescue' Ruby does not 'ensure' when I 'retry' in 'rescue' ruby ruby

Ruby does not 'ensure' when I 'retry' in 'rescue'


The ensure section is executed when leaving the begin statement (by any means) but when you retry, you're just moving around inside the statement so the ensure section will not be executed.

Try this version of your example to get a better idea of what's going on:

attempts = 0begin  make_service_call()rescue Exception  attempts += 1  retry unless attempts > 2  exit -1ensure  puts "ensure! #{attempts}"end


ensure code is executed once, just before the code block exits and it will be called at that time.

But because of the unless attempts>2 condition, and the fact that ensure will only be called "just before the code exits" (e.g. due to exit -1) the attempts += 1 will not be executed, and so there is an infinite loop.

ensure is like __finally in C++ : you could catch the exception and then use a goto : but finally will not be called until the function is actually about to exit.