标签: python-tenacity

Python 重试包 - tenacity:如何记录异常的根本原因?

正如在这个问题中所讨论的,我正在利用坚韧来重试。

玩具代码如下所示

import logging
from tenacity import retry
import tenacity


@retry(wait=tenacity.wait_incrementing(start=10, increment=10, max=100), stop=tenacity.stop_after_attempt(3))
def print_msg():
    logging.info('Hello')
    logging.info("World")
    raise Exception('Test error')


if __name__ == '__main__':
    logging.basicConfig(
        format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
        datefmt='%d-%m-%Y:%H:%M:%S',
        level=logging.INFO)
    logging.info('Starting')
    print_msg()
Run Code Online (Sandbox Code Playgroud)

输出如下所示

21-11-2018:12:40:48,586 INFO     [retrier.py:18] Starting
21-11-2018:12:40:48,586 INFO     [retrier.py:8] Hello
21-11-2018:12:40:48,586 INFO     [retrier.py:9] World
21-11-2018:12:40:58,592 INFO     [retrier.py:8] Hello
21-11-2018:12:40:58,592 INFO     [retrier.py:9] World
21-11-2018:12:41:18,596 INFO     [retrier.py:8] Hello
21-11-2018:12:41:18,596 INFO     [retrier.py:9] World
21-11-2018:12:41:18,596 ERROR    [retrier.py:22] Received Exception
Traceback (most recent call last):
  File "/Users/dmanna/PycharmProjects/demo/retrier.py", line …
Run Code Online (Sandbox Code Playgroud)

python python-2.7 python-tenacity

8
推荐指数
1
解决办法
1万
查看次数

Python 坚韧:如果所有重试都失败,如何重试函数而不引发异常?

假设我有以下功能:

@retry(stop=stop_after_attempt(3))
def foo():
  try:
    response = requests.post(...)
    response.raise_for_status()
    return response
  except Exception as e:
    raise e
Run Code Online (Sandbox Code Playgroud)

该函数将重试 3 次,如果 3 次重试均失败,则会引发异常。

如何使用坚韧重试 3 次而不引发异常?就像是:

@retry(stop=stop_after_attempt(3))
def foo(ignore_errors=False):
  try:
    response = requests.post(...)
    response.raise_for_status()
    return response
  except Exception as e:
    if ignore_errors and function has been retried three times:
      pass
    raise e
Run Code Online (Sandbox Code Playgroud)

python python-requests python-tenacity

8
推荐指数
2
解决办法
5774
查看次数

Python坚韧:如果异常不是某种类型,如何重试?

如果异常不是某种类型,如何使用 Python 的坚韧重试函数?

retry_if_exception_type如果出现某种类型的异常,将重试。not放置在方法之前或其参数之前似乎不起作用。

retry_unless_exception_type,另一方面,即使没有上升错误,也会永远循环,直到出现某种类型的上升错误。

python error-handling exception python-3.x python-tenacity

5
推荐指数
1
解决办法
8518
查看次数

Python Tenacity 日志重试异常

我正在使用该tenacity包重试某个功能。我的重试装饰器如下所示:

@retry(wait=wait_exponential(multiplier=1/(2**5), max=60), after=after_log(logger, logging.INFO))
Run Code Online (Sandbox Code Playgroud)

在异常情况下,我收到如下日志消息:

INFO:mymodule:Finished call to 'mymodule.MyClass.myfunction' after 0.001(s), this was the 1st time calling it.
Run Code Online (Sandbox Code Playgroud)

除了已经记录的内容之外,我还想记录实际的异常(1 行格式,最好不是堆栈跟踪)。凭着毅力能做到吗?或者我只需要捕获异常、打印并重新引发?

python python-tenacity

3
推荐指数
1
解决办法
3512
查看次数

Tenacity输出重试消息?

代码

import logging
from tenacity import retry, wait_incrementing, stop_after_attempt
import tenacity


@retry(wait=wait_incrementing(start=10, increment=10, max=100), stop=stop_after_attempt(3))
def print_msg():
    logging.info('Hello')
    logging.info("World")
    raise Exception('Test error')

if __name__ == '__main__':
    logging.basicConfig(
        format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
        datefmt='%d-%m-%Y:%H:%M:%S',
        level=logging.INFO)
    logging.info('Starting')
    print_msg()
Run Code Online (Sandbox Code Playgroud)

输出

21-11-2018:12:40:48,586 INFO     [retrier.py:18] Starting
21-11-2018:12:40:48,586 INFO     [retrier.py:8] Hello
21-11-2018:12:40:48,586 INFO     [retrier.py:9] World
21-11-2018:12:40:58,592 INFO     [retrier.py:8] Hello
21-11-2018:12:40:58,592 INFO     [retrier.py:9] World
21-11-2018:12:41:18,596 INFO     [retrier.py:8] Hello
21-11-2018:12:41:18,596 INFO     [retrier.py:9] World
21-11-2018:12:41:18,596 ERROR    [retrier.py:22] Received Exception
....
Run Code Online (Sandbox Code Playgroud)

如何记录重试?例如

Error. Retrying 1...
...
Error. Retrying 2...
...
Run Code Online (Sandbox Code Playgroud)

python python-tenacity tenacity

3
推荐指数
1
解决办法
3457
查看次数