除了一个例外,总是执行finally块

kab*_*nus 3 python exception-handling

我有一个try:finally必须始终执行(无论是否异常)的块,除非发生特定的异常。为了论证,我们假设它是一个ValueError,所以我问我是否可以实现:

try:
    stuff()
except Exception as e:
    if type(e) is ValueError: raise
    #do important stuff
    raise

#do important stuff
Run Code Online (Sandbox Code Playgroud)

以一种更优雅的方式跳过复制粘贴#importantstuff。如果我统治Python,它将看起来像:

try:
    stuff()
finally except ValueError:
    #do important stuff
Run Code Online (Sandbox Code Playgroud)

#importantstuff一个函数是不是一个答案,但不可能IS。

Mar*_*ers 6

如果您需要finally在特定条件下跳过某些内容,则需要使用一个显式标志:

do_final_stuff = True
try:
    # ...
except ValueError:
    do_final_stuff = False
    raise
finally:
    if do_final_stuff:
        # ...
Run Code Online (Sandbox Code Playgroud)

您还可以在此处使用上下文管理器进行清理。如果存在以下情况,则将当前的活动异常传递给上下文管理器:

class MyContextManager:
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, tb):
        if exc_type is not ValueError:
            # do cleanup

with MyContextManager():
    # ...
Run Code Online (Sandbox Code Playgroud)