Ruby comes with a retry mechanism that allows you to recover from known exceptions by retrying the code that led to the exception. In network or timing-based situations where race conditions are possible, the most straightforward recourse may be to just retry a couple times.
Set up a begin
/ rescue
block like you'd normally do for a chunk of code
that may raise an exception. Then add a retry
call to the rescue
block.
begin
puts "About to do a thing (#{retries})"
raise StandardError if rand(5) != 4
puts "Success!"
rescue StandardError => e
retry
end
If an exception is raised, this will tell Ruby to re-execute the code in the
begin
block over and over until the exception isn't raised.
To avoid an infinite loop, you can limit the retries with a counting variable.
begin
retries ||= 0
puts "About to do a thing (#{retries})"
raise StandardError if rand(5) != 4
puts "Success!"
rescue StandardError => e
retry if (retries = 1) < 3
# all retries failed, re-raise exception
raise e
end
This will re-raise after 3 tries.
Here is the full example