Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 上下文管理器在异常后重试块_Python_Loops_Exception_Contextmanager - Fatal编程技术网

Python 上下文管理器在异常后重试块

Python 上下文管理器在异常后重试块,python,loops,exception,contextmanager,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

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

with RetryOnException(Some.Exception):
    obj.doit()
这相当于:

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

我对一个可能引发异常的方法有很多调用,每次都要编写所有的样板文件是非常不方便的。

不,上下文管理器不能迭代它包含的代码体。要执行与您的要求类似的操作:

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