Retry A Block After An Exception
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
endIf 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
endThis will re-raise after 3 tries.
Here is the full example
Last updated
Was this helpful?