Skip to content

Instantly share code, notes, and snippets.

@apua
Created January 5, 2016 10:13
Show Gist options
  • Save apua/14938cf272f40514c6b6 to your computer and use it in GitHub Desktop.
Save apua/14938cf272f40514c6b6 to your computer and use it in GitHub Desktop.
retry
import functools
import sys
logger = lambda: 0
logger.info = lambda s: sys.stdout.write(s+'\n')
logger.error = lambda s: sys.stdout.write(s+'\n')
def retry(tries, exceptions, logger):
def retry_dec(func):
@functools.wraps(func)
def new_func(*args, **kwargs):
for t in range(tries): # or `tries+1`
try:
return func(*args, **kwargs)
except exceptions as e:
logger.info("try %r [%s/%s]" % (func.func_name, t, tries))
logger.info(e.message)
else:
break
else:
logger.error("try %r %s times fail" % (func.func_name, tries))
return new_func
return retry_dec
@retry(3, (ZeroDivisionError,), logger)
def divide(a,b):
"""do something which has no side effect"""
return a/b
print divide(1,0)
print "===="
print divide(1,1)
"""
try 'divide' [0/3]
integer division or modulo by zero
try 'divide' [1/3]
integer division or modulo by zero
try 'divide' [2/3]
integer division or modulo by zero
try 'divide' 3 times fail
None
====
1
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment