我在使用python3中坚韧库中的"retry“工具时遇到了问题。当我使用生成器.时,“重试”装饰器似乎不起作用。
我有一个代码示例来说明我的情况:
from tenacity import retry, wait_exponential
@retry(wait=wait_exponential(multiplier=1, min=1, max=1))
def test_retry():
print("test retry from tenacity")
for i in range(10):
if i == 0: raise Exception
yield i
def gen():
yield from test_retry()
bar = gen()
for foo in bar:
print(foo)当它引发异常时,它不会重试。有人知道为什么这不管用吗?
谢谢
发布于 2020-05-03 08:39:48
这是一个错误/特性/困境,它本身具有坚韧性,其中重试逻辑在生成器函数上失败。坚韧的开发者表示,这是因为“发电机内部使用异常。” --最初的开发人员--进一步写道,"tenacity.retry()封装了生成器函数,而不是生成器本身(即用户代码)。“基本上没有任何计划来解决这种行为,如果它甚至可以完成的话。
为了处理这个问题,应该在调用生成器的方法中添加坚韧注释--在这些方法中,当异常在调用堆栈中冒泡时,可以很容易地被坚韧捕获。重要:生成器函数也不能隐藏异常。
# in generator do this and add retry annotations to calling method
...
try:
do_something()
except Exception as ex:
log_or_do_something_else()
raise
finally:
cleanup()
yield something
...
# in generator don't do this
...
try:
do_something()
except Exception as ex:
pass
yield something
...https://stackoverflow.com/questions/60838665
复制相似问题