diff options
author | Ray Holder <ray@blacklocus.com> | 2014-03-30 22:21:53 -0500 |
---|---|---|
committer | Ray Holder <ray@blacklocus.com> | 2014-03-30 22:21:53 -0500 |
commit | f405d7ecc33cd31cfe8cc60cce70ba78cc444577 (patch) | |
tree | 68d8d4460849b0e6ca21161ef79351da9437648d /retrying.py | |
parent | f728447c8cc614fbcd056d6f062e4cdd126e7a49 (diff) | |
download | retrying-f405d7ecc33cd31cfe8cc60cce70ba78cc444577.tar.gz |
propagate complete tracebacks such that they show up in nested stack frames, adjust api and tests #1
Diffstat (limited to 'retrying.py')
-rw-r--r-- | retrying.py | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/retrying.py b/retrying.py index c624d09..b0b1c3b 100644 --- a/retrying.py +++ b/retrying.py @@ -15,6 +15,7 @@ import random import sys import time +import traceback # sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... MAX_WAIT = 1073741823 @@ -139,7 +140,7 @@ class Retrying: def should_reject(self, attempt): reject = False if attempt.has_exception: - reject |= self._retry_on_exception(attempt.value) + reject |= self._retry_on_exception(attempt.value[1]) else: reject |= self._retry_on_result(attempt.value) @@ -152,8 +153,8 @@ class Retrying: try: attempt = Attempt(fn(*args, **kwargs), attempt_number, False) except: - e = sys.exc_info()[1] - attempt = Attempt(e, attempt_number, True) + tb = sys.exc_info() + attempt = Attempt(tb, attempt_number, True) if not self.should_reject(attempt): return attempt.get(self._wrap_exception) @@ -189,10 +190,16 @@ class Attempt: if wrap_exception: raise RetryError(self) else: - raise self.value + raise self.value[0], self.value[1], self.value[2] else: return self.value + def __repr__(self): + if self.has_exception: + return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) + else: + return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) + class RetryError(Exception): """ A RetryError encapsulates the last Attempt instance right before giving up. @@ -202,4 +209,4 @@ class RetryError(Exception): self.last_attempt = last_attempt def __str__(self): - return "Last attempt: %s" % str(self.last_attempt) + return "RetryError[{0}]".format(self.last_attempt) |