玩具代码如下所示
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) 假设我有以下功能:
@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 的坚韧重试函数?
retry_if_exception_type如果出现某种类型的异常,将重试。not放置在方法之前或其参数之前似乎不起作用。
retry_unless_exception_type,另一方面,即使没有上升错误,也会永远循环,直到出现某种类型的上升错误。
我正在使用该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 行格式,最好不是堆栈跟踪)。凭着毅力能做到吗?或者我只需要捕获异常、打印并重新引发?
代码
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)