Skip to content

Instantly share code, notes, and snippets.

@JunilJacob
Forked from cainlevy/with_retries.rb
Created June 27, 2022 18:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JunilJacob/15c2899e26b71de4e3d87a0429290522 to your computer and use it in GitHub Desktop.
Save JunilJacob/15c2899e26b71de4e3d87a0429290522 to your computer and use it in GitHub Desktop.
with_retries{} helper to easily catch and retry exceptions in Ruby
module Retriable
# This will catch any exception and retry twice (three tries total):
# with_retries { ... }
#
# This will catch any exception and retry four times (five tries total):
# with_retries(:limit => 5) { ... }
#
# This will catch a specific exception and retry once (two tries total):
# with_retries(Some::Error, :limit => 2) { ... }
#
# You can also sleep inbetween tries. This is helpful if you're hoping
# that some external service recovers from its issues.
# with_retries(Service::Error, :sleep => 1) { ... }
#
def with_retries(*args, &block)
options = args.extract_options!
exceptions = args
options[:limit] ||= 3
options[:sleep] ||= 0
exceptions = [Exception] if exceptions.empty?
retried = 0
begin
yield
rescue *exceptions => e
if retried + 1 < options[:limit]
retried += 1
sleep options[:sleep]
retry
else
raise e
end
end
end
end
class Object
include Retriable
extend Retriable
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment