This provides decorators for super simple function/method call retries when an exception is raised.
pip install trythatagain
Here's a simple use case: querying the AWS API, knowing you might hit API limits.
from trythatagain import retry @retry def find_ebs_volumes(unattached=True, no_snapshots=True): ... try: find_ebs_volumes() except CaughtException as e: print('Failed to list EBS volumes') print(e.caught_exception)
This will retry calling
func three times. If was not successful in calling the function without an exception, it will re-raise the exception as
CaughtException, with the original exception available at the attribute
Retry as many times as times as necessary:
from trythatagain import retry @retry(retries=5) def try_five_times(): raise Exception('This always fails') @retry(retries=0) def retry_forever(): raise Exception('Terrible waste of CPU cycles')
Raise immediately on specific exceptions:
@retry(raise_for=ValueError) def update_cache(): ...
Suppress re-raising exceptions:
@retry(reraise=False) def reload_user_data(): ...
There's also exponential and linear backoff retries things like cooling down after hitting API limits. In fact, AWS recommends exponential backoff to deal with API limits.
# waits 1 second, then 4, then 9, etc. @retry_exp_backoff(unit=MILLISECONDS) def update_instance_tags(): ... @retry_linear_backoff(unit=SECONDS) def scrape_url(): ...
Custom wait functions are also possible:
def fixed(i, unit): time.sleep(5 * unit) @retry(wait_func=fixed, unit=MILLISECONDS) def func(): ...