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

时间:2016-10-27 06:53:57

标签: 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

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

try:
    stuff()
finally except ValueError:
    #do important stuff

#importantstuff放在函数中不是答案,但不可能是。

1 个答案:

答案 0 :(得分:4)

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

do_final_stuff = True
try:
    # ...
except ValueError:
    do_final_stuff = False
    raise
finally:
    if do_final_stuff:
        # ...

你也可以在这里使用上下文管理器,然后进行清理。如果存在上下文管理器,则传递当前活动异常:

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():
    # ...