python中的错误处理程序

我很难找到“
pythonic”方法来做到这一点:

我需要使用相同的try-except模式捕获不同的代码块.

要捕获的块彼此不同.

目前,我在代码的几个点重复了相同的try-except模式,并列出了一长串异常.

try:
    block to catch
except E1, e:
    log and do something
except E2, e:
    log and do something
...
except Exception, e:
    log and do something

有一种很好的方法可以使用with语句和上下文管理器装饰器来解决这个问题:

from contextlib import contextmanager

@contextmanager
def error_handler():
    try:
        yield
    except E1, e:
        log and do something
    ...
    except Exception, e:
        log and do something


...
with error_handler():
    block to catch
...

但是,如果我需要知道块中是否存在异常,会发生什么?即是否有任何替代方法可以像以前一样用try-except-else执行某些操作?

一个用例示例:

for var in vars:
    try:
        block to catch
    except E1, e:
        log and do something
        # continue to the next loop iteration
    except E2, e:
        log and do something
        # continue to the next loop iteration
    ...
    except Exception, e:
        log and do something
        # continue to the next loop iteration
    else:
        do something else

我可以用pythonic的方式做一些这样的事情,以避免一次又一次地重复相同的try-except模式吗?

最佳答案 我可以看到你已经得到了答案,但是在你已经拥有的东西的基础上,你可以回退一个指示错误状态的对象,并用它来检查你的循环.

在使用这种风格之前,你应该考虑隐藏错误处理/记录这种结构是否真的是你想要做的事情,“Pythonic”通常更倾向于明确而不是隐藏细节.

from contextlib import contextmanager

@contextmanager
def error_handler():
    error = True
    try:
        class Internal:
            def caughtError(self): return error
        yield Internal()
    except Exception as e:
        print("Logging#1")
    except BaseException as e:
        print("Logging#2")
    else:
        error = False

with error_handler() as e:
    print("here")
#    raise Exception("hopp")

print(e.caughtError())         # True if an error was logged, False otherwise
点赞