I'm using the python tenacity library to do exponential backoff of a funtion.
import tenacity
def log_attempt_number(retry_state):
print(f"Retrying: {retry_state.attempt_number}...")
print(retry_state.outcome)
@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(100), after=log_attempt_number)
def throw_exception():
throw Exception("What is this exception?")
This code gives me:
Retrying: 1...
<Future at 0x7feeaf6354c0 state=finished raised Exception>
Retrying: 2...
<Future at 0x7feeaf401580 state=finished raised Exception>
Retrying: 3...
<Future at 0x7feeaf6354c0 state=finished raised Exception>
Retrying: 4...
<Future at 0x7feeaf401580 state=finished raised Exception>
Retrying: 5...
<Future at 0x7feeaf6354c0 state=finished raised Exception>
...
But I want to see the error message, not the Future object. On their website, all I can see as an option to get the error message is the function result() which gives me the error message and then terminates.
def log_attempt_number(retry_state):
print(f"Retrying: {retry_state.attempt_number}...")
print(retry_state.outcome.result()) #This function terminates the program
@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(100),
after=log_attempt_number)
def throw_exception():
throw Exception("What is this exception?")
...
Retrying: 1...
What is this Exception?
worryword@WorryWord:~/Development/SOTests$
So my question is: how do I get the error message without terminating the program? I have an issue where the first error is not necessarily the 10th error, etc.
As a workaround, I used a try-except like so:
try:
retry_state.outcome.result()
except Exception as e:
print(e)
This gives you the exception without terminating the program.