def retry(condition, retry_times, interval=60, ignore_error=True):
"""
@condition: condition variable or func.
@retry_times: you know it means.
@interval: wait time before retrying
@param: ignore_error, retry if error happened.
"""
def wrap(f):
def wrapped_f(*args):
__retry_times = retry_times - 1
__interval = interval
__ignore_error = ignore_error
__does_error_happened = False
if not hasattr(f, '__call__'):
raise RetryException("func is not a callable.")
if type(__retry_times) != int:
raise RetryException("retry_times is not a number.")
if __retry_times < 0:
__retry_times = 0
def get_condition():
if __ignore_error and __does_error_happened:
return True
elif hasattr(condition, '__call__'):
return condition()
else:
return condition
while get_condition() and __retry_times >= 0:
print("Retry times remain -> ", __retry_times)
try:
f(*args)
__does_error_happened = False
except Exception as e:
print("##############################################################################")
print(" >>> Exception Happened <<< ")
print(traceback.format_exc())
print(" ^^^ Check What Happened ^^^ ")
print("##############################################################################")
__does_error_happened = True
if not ignore_error:
raise e
__retry_times -= 1
if get_condition():
print ("""
******************************************************************************
Condition fail, retry will be performed in next %ss
******************************************************************************
""" % interval)
time.sleep(__interval)
return wrapped_f
return wrap