> Returning a boolean isn't very Pythonic. It would be better, IMHO, if > it could swallow a specified exception (or specified exceptions?) > raised when an attempt failed, up to the maximum permitted number of > attempts. If the final attempt fails, propagate the exception. > -- > http://mail.python.org/mailman/listinfo/python-list
Yes right I also didn't like it.. Now it become something as below, so I capture every possible exception (since it must be generic) and log what exception was raised. I'm not re-raising because if it fails and it's fatal I should just exit, and if it's not fatal it should just continue.. class retry_n_times: def __init__(self, ntimes=3, timeout=3, fatal=True): self.ntimes = ntimes self.timeout = timeout self.fatal = fatal def __call__(self, func): def _retry_n_times(*args, **kwargs): attempts = 0 while True: logger.debug("Attempt number %s of %s" % (attempts, func.__name__)) try: ret = func(*args, **kwargs) except Exception as e: logger.error("Got exception %s with error %s" % (type(e), str(e))) sleep(self.timeout) else: return ret attempts += 1 if attempts == self.ntimes: logger.error("Giving up the attempts while running %s" % func.__name__) if self.fatal: exit(100) return _retry_n_times -- http://mail.python.org/mailman/listinfo/python-list