我有一个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
放在函数中不是答案,但不可能是。
答案 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():
# ...