Исключение журнала Python Tenacity при повторной попытке
Я использую
tenacity
пакет, чтобы повторить попытку функции. Мой декоратор повторов выглядит так:
@retry(wait=wait_exponential(multiplier=1/(2**5), max=60), after=after_log(logger, logging.INFO))
В исключительных случаях я получаю такое сообщение в журнале:
INFO:mymodule:Finished call to 'mymodule.MyClass.myfunction' after 0.001(s), this was the 1st time calling it.
Я хочу зарегистрировать фактическое исключение (однострочный формат, предпочтительно не трассировку стека) в дополнение к тому, что уже зарегистрировано. Может ли это быть сделано с упорством? Или мне просто нужно поймать исключение, распечатать и повторно вызвать?
1 ответ
Вы можете установитьbefore_sleep
параметр. Этот вызываемый объект получаетexc_info
брошенный вашим кодом. Ссылка: https://tenacity.readthedocs.io/en/latest/api.html#module-tenacity.before_sleep
Пример
import logging
from typing import Final
from tenacity import (
after_log,
before_sleep_log,
retry,
retry_if_exception_type,
stop_after_attempt,
wait_exponential,
)
logger: Final = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
@retry(
reraise=True,
before_sleep=before_sleep_log(logger, logging.INFO),
after=after_log(logger, logging.INFO),
wait=wait_exponential(multiplier=1, min=1, max=8),
retry=retry_if_exception_type(ZeroDivisionError),
stop=stop_after_attempt(4),
)
def never_gonna_give_you_up() -> None:
1 / 0
if __name__ == "__main__":
never_gonna_give_you_up()
Выход
INFO:__main__:Finished call to '__main__.never_gonna_give_you_up' after 0.000(s), this was the 1st time calling it.
INFO:__main__:Retrying __main__.never_gonna_give_you_up in 1.0 seconds as it raised ZeroDivisionError: division by zero.
INFO:__main__:Finished call to '__main__.never_gonna_give_you_up' after 1.015(s), this was the 2nd time calling it.
INFO:__main__:Retrying __main__.never_gonna_give_you_up in 2.0 seconds as it raised ZeroDivisionError: division by zero.
INFO:__main__:Finished call to '__main__.never_gonna_give_you_up' after 3.031(s), this was the 3rd time calling it.
INFO:__main__:Retrying __main__.never_gonna_give_you_up in 4.0 seconds as it raised ZeroDivisionError: division by zero.
INFO:__main__:Finished call to '__main__.never_gonna_give_you_up' after 7.031(s), this was the 4th time calling it.
Traceback (most recent call last):
File "C:\***.py", line 33, in <module>
never_gonna_give_you_up()
File "C:\Users\***\lib\site-packages\tenacity\__init__.py", line 324, in wrapped_f
return self(f, *args, **kw)
File "C:\Users\***\lib\site-packages\tenacity\__init__.py", line 404, in __call__
do = self.iter(retry_state=retry_state)
File "C:\Users\***\lib\site-packages\tenacity\__init__.py", line 360, in iter
raise retry_exc.reraise()
File "C:\Users\***\lib\site-packages\tenacity\__init__.py", line 193, in reraise
raise self.last_attempt.result()
File "C:\Users\***\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\_base.py", line 439, in result
return self.__get_result()
File "C:\Users\***\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\_base.py", line 391, in __get_result
raise self._exception
File "C:\Users\***\lib\site-packages\tenacity\__init__.py", line 407, in __call__
result = fn(*args, **kwargs)
File "C:\***.py", line 29, in never_gonna_give_you_up
1 / 0
ZeroDivisionError: division by zero
Эти строки напечатаныbefore_sleep_log
:
Retrying __main__.never_gonna_give_you_up in 1.0 seconds as it raised ZeroDivisionError: division by zero.