Skip to content

Instantly share code, notes, and snippets.

@cainlevy
Created October 28, 2011 21:19
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save cainlevy/1323593 to your computer and use it in GitHub Desktop.
Save cainlevy/1323593 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
@seanlinsley
Copy link

You really shouldn't rescue from Exception. Use StandardError instead.

FYI: http://stackoverflow.com/questions/10048173

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment