Module: Kernel
- Defined in:
- lib/rescue_me.rb
Instance Method Summary collapse
-
#rescue_and_retry(max_attempts = 7, *temporary_exceptions) ⇒ Object
Reattempts to run code passed in to this block if a temporary exception occurs (e.g. Net::SMTPServerBusy), using an exponential back-off algorithm (e.g. retry immediately, then after 1, 2, 4, 8, 16, 32… sec).
Instance Method Details
#rescue_and_retry(max_attempts = 7, *temporary_exceptions) ⇒ Object
Reattempts to run code passed in to this block if a temporary exception occurs (e.g. Net::SMTPServerBusy), using an exponential back-off algorithm (e.g. retry immediately, then after 1, 2, 4, 8, 16, 32… sec).
max_attempts - the maximum number of attempts to make trying to run the
block successfully before giving up
temporary_exceptions - temporary exceptions that are to be caught in your
code. If no exceptions are provided will capture all Exceptions. You are
strongly encouraged to provide arguments that capture temporary
exceptional conditions that are likely to work upon a retry.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/rescue_me.rb', line 13 def rescue_and_retry(max_attempts=7, *temporary_exceptions) retry_interval = 2 # A good initial start value. Tweak as needed. temporary_exceptions << StandardError if temporary_exceptions.empty? begin yield rescue *temporary_exceptions => e attempt = (attempt || 0) + 1 = "rescue_and_retry(#{attempt}/#{max_attempts}) " + "\"#{e.class}: #{e.}\" in #{caller[1].sub(/.*\/(.*):in.*/,'\1')}" (defined? logger) ? logger.warn() : STDERR.puts() raise(e) if attempt >= max_attempts # Retry immediately before exponential waits (1, 2, 4, 16, ... sec) sleep retry_interval**(attempt - 2) if attempt >= 2 retry end end |