上下文管理器在异常后重试阻止

时间:2015-12-08 01:00:08

标签: python loops exception contextmanager

是否可以使用上下文管理器来执行代码块,并在它抛出特定异常时继续重试。像这样:

with RetryOnException(Some.Exception):
    obj.doit()

这相当于:

while True:
    try:
        obj.doit()
    except Some.Exception:
        logger.exception("failed")
        time.sleep(1)
    else:
        break

我对一个可以抛出异常的方法有很多调用,每次必须编写所有样板文件都非常不方便。

1 个答案:

答案 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))