是否可以使用上下文管理器来执行代码块,并在它抛出特定异常时继续重试。像这样:
with RetryOnException(Some.Exception):
obj.doit()
这相当于:
while True:
try:
obj.doit()
except Some.Exception:
logger.exception("failed")
time.sleep(1)
else:
break
我对一个可以抛出异常的方法有很多调用,每次必须编写所有样板文件都非常不方便。
答案 0 :(得分:2)
不,上下文管理器无法迭代它包含的代码体。做一些类似于你的要求:
def retry(f, on_exception=None, exception_type=Exception):
# a default exception handler
on_exception = on_exception or lambda e: pass
while True:
try:
return f()
except exception_type as e:
on_exception(e)
然后您可以将其称为例如:
def my_handler(e):
logger.exception("failed")
time.sleep(1)
retry(obj.doit, on_exception=my_handler)
或者更简洁地说,在这种情况下,简单地说:
retry(obj.doit, lambda e: logger.exception("failed"), time.sleep(1))