1010
1111
1212def __retry_internal (f , exceptions = Exception , tries = - 1 , delay = 0 , max_delay = None , backoff = 1 , jitter = 0 ,
13- logger = logging_logger , log_traceback = False ):
13+ logger = logging_logger , log_traceback = False , on_exception = None ):
1414 """
1515 Executes a function and retries it if it failed.
1616
@@ -24,13 +24,20 @@ def __retry_internal(f, exceptions=Exception, tries=-1, delay=0, max_delay=None,
2424 fixed if a number, random if a range tuple (min, max)
2525 :param logger: logger.warning(fmt, error, delay) will be called on failed attempts.
2626 default: retry.logging_logger. if None, logging is disabled.
27+ :param on_exception: handler called when exception occurs. will be passed the captured
28+ exception as an argument. further retries are stopped when handler
29+ returns True. default: None
2730 :returns: the result of the f function.
2831 """
2932 _tries , _delay = tries , delay
3033 while _tries :
3134 try :
3235 return f ()
3336 except exceptions as e :
37+ if on_exception is not None :
38+ if on_exception (e ):
39+ break
40+
3441 _tries -= 1
3542 if not _tries :
3643 raise
@@ -58,7 +65,7 @@ def __retry_internal(f, exceptions=Exception, tries=-1, delay=0, max_delay=None,
5865
5966
6067def retry (exceptions = Exception , tries = - 1 , delay = 0 , max_delay = None , backoff = 1 , jitter = 0 , logger = logging_logger ,
61- log_traceback = False ):
68+ log_traceback = False , on_exception = None ):
6269 """Returns a retry decorator.
6370
6471 :param exceptions: an exception or a tuple of exceptions to catch. default: Exception.
@@ -70,6 +77,9 @@ def retry(exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, ji
7077 fixed if a number, random if a range tuple (min, max)
7178 :param logger: logger.warning(fmt, error, delay) will be called on failed attempts.
7279 default: retry.logging_logger. if None, logging is disabled.
80+ :param on_exception: handler called when exception occurs. will be passed the captured
81+ exception as an argument. further retries are stopped when handler
82+ returns True. default: None
7383 :returns: a retry decorator.
7484 """
7585
@@ -78,13 +88,13 @@ def retry_decorator(f, *fargs, **fkwargs):
7888 args = fargs if fargs else list ()
7989 kwargs = fkwargs if fkwargs else dict ()
8090 return __retry_internal (partial (f , * args , ** kwargs ), exceptions , tries , delay , max_delay , backoff , jitter ,
81- logger , log_traceback = log_traceback )
91+ logger , log_traceback , on_exception )
8292
8393 return retry_decorator
8494
8595
8696def retry_call (f , fargs = None , fkwargs = None , exceptions = Exception , tries = - 1 , delay = 0 , max_delay = None , backoff = 1 ,
87- jitter = 0 , logger = logging_logger , log_traceback = False ):
97+ jitter = 0 , logger = logging_logger , log_traceback = False , on_exception = None ):
8898 """
8999 Calls a function and re-executes it if it failed.
90100
@@ -100,9 +110,12 @@ def retry_call(f, fargs=None, fkwargs=None, exceptions=Exception, tries=-1, dela
100110 fixed if a number, random if a range tuple (min, max)
101111 :param logger: logger.warning(fmt, error, delay) will be called on failed attempts.
102112 default: retry.logging_logger. if None, logging is disabled.
113+ :param on_exception: handler called when exception occurs. will be passed the captured
114+ exception as an argument. further retries are stopped when handler
115+ returns True. default: None
103116 :returns: the result of the f function.
104117 """
105118 args = fargs if fargs else list ()
106119 kwargs = fkwargs if fkwargs else dict ()
107120 return __retry_internal (partial (f , * args , ** kwargs ), exceptions , tries , delay , max_delay , backoff , jitter , logger ,
108- log_traceback = log_traceback )
121+ log_traceback , on_exception )
0 commit comments