The retry decorator reruns a funtion tries times if an exception occurs.
import timeclass 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
