Sal
Peter Hoffmann Director Data Engineering at Blue Yonder. Python Developer, Conference Speaker, Mountaineer

Retry Decorator in Python

The retry decorator reruns a funtion tries times if an exception occurs.

import time

class Retry(object):
    default_exceptions = (Exception,)
    def __init__(self, tries, exceptions=None, delay=0):
        """
        Decorator for retrying a function if exception occurs

        tries -- num tries 
        exceptions -- exceptions to catch
        delay -- wait between retries
        """
        self.tries = tries
        if exceptions is None:
            exceptions = Retry.default_exceptions
        self.exceptions =  exceptions
        self.delay = delay

    def __call__(self, f):
        def fn(*args, **kwargs):
            exception = None
            for _ in range(self.tries):
                try:
                    return f(*args, **kwargs)
                except self.exceptions, e:
                    print "Retry, exception: "+str(e)
                    time.sleep(self.delay)
                    exception = e
            #if no success after tries, raise last exception
            raise exception
        return fn

Usage:

>>> from retry_decorator import Retry
>>> @Retry(2)
... def fail_fn():
...     raise Exception("failed")
... 
>>> fail_fn()
Retry, exception: failed
Retry, exception: failed
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "retry_decorator.py", line 32, in fn
    raise exception
Exception: failed

gist.github.com Repository: http://gist.github.com/470611