summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Harlow <harlowja@yahoo-inc.com>2015-06-23 18:15:41 -0700
committerJoshua Harlow <harlowja@yahoo-inc.com>2015-06-23 18:19:07 -0700
commit919d6e0011f2c725e0bf613d8b5fcf7e48b41cce (patch)
treea55c9bb40073c4e58e9979ee8792dc669473e6ea
parentda33537e0850f997aea75c4dec010e2b5594071f (diff)
downloadretrying-919d6e0011f2c725e0bf613d8b5fcf7e48b41cce.tar.gz
Allow providing exception tuple for 'retry_on_exception' argument
It seems like a common pattern to have a function that is used that just checks if the exception that is thrown is of a given type so to avoid duplicating this pattern by all retry library users just natively provide support for it.
-rw-r--r--retrying.py13
-rw-r--r--test_retrying.py6
2 files changed, 15 insertions, 4 deletions
diff --git a/retrying.py b/retrying.py
index 3ed312d..32b8db6 100644
--- a/retrying.py
+++ b/retrying.py
@@ -23,6 +23,12 @@ import traceback
MAX_WAIT = 1073741823
+def _retry_if_exception_of_type(retryable_types):
+ def _retry_if_exception_these_types(exception):
+ return isinstance(exception, retryable_types)
+ return _retry_if_exception_these_types
+
+
def retry(*dargs, **dkw):
"""
Decorator function that instantiates the Retrying object
@@ -127,9 +133,14 @@ class Retrying(object):
if retry_on_exception is None:
self._retry_on_exception = self.always_reject
else:
+ # this allows for providing a tuple of exception types that
+ # should be allowed to retry on, and avoids having to create
+ # a callback that does the same thing
+ if isinstance(retry_on_exception, (tuple)):
+ retry_on_exception = _retry_if_exception_of_type(
+ retry_on_exception)
self._retry_on_exception = retry_on_exception
- # TODO simplify retrying by Exception types
# retry on result filter
if retry_on_result is None:
self._retry_on_result = self.never_reject
diff --git a/test_retrying.py b/test_retrying.py
index bfef02d..4c30893 100644
--- a/test_retrying.py
+++ b/test_retrying.py
@@ -252,7 +252,7 @@ def _retryable_test_with_stop(thing):
return thing.go()
-@retry(retry_on_exception=retry_if_exception_of_type(IOError))
+@retry(retry_on_exception=(IOError,))
def _retryable_test_with_exception_type_io(thing):
return thing.go()
@@ -264,14 +264,14 @@ def _retryable_test_with_exception_type_io_wrap(thing):
@retry(
stop_max_attempt_number=3,
- retry_on_exception=retry_if_exception_of_type(IOError))
+ retry_on_exception=(IOError,))
def _retryable_test_with_exception_type_io_attempt_limit(thing):
return thing.go()
@retry(
stop_max_attempt_number=3,
- retry_on_exception=retry_if_exception_of_type(IOError),
+ retry_on_exception=(IOError,),
wrap_exception=True)
def _retryable_test_with_exception_type_io_attempt_limit_wrap(thing):
return thing.go()