我正在清理一些代码,并遇到了一些情况,其中在try / except中有重复的清理操作:
try:
...
except KeyError , e :
cleanup_a()
cleanup_b()
cleanup_c()
handle_keyerror()
except ValuesError , e :
cleanup_a()
cleanup_b()
cleanup_c()
handle_valueerror()
我想让它们在可读性和维护方面更加标准化。 “清理”操作似乎是块的本地操作,因此执行以下操作并不会更加清晰(尽管它会使其标准化一点):
def _cleanup_unified():
cleanup_a()
cleanup_b()
cleanup_c()
try:
...
except KeyError , e :
_cleanup_unified()
handle_keyerror()
except ValuesError , e :
_cleanup_unified()
handle_valueerror()
有人可以建议其他方法来解决这个问题吗?
答案 0 :(得分:1)
如果清理始终可以运行,则可以使用finally
子句,该子句运行是否抛出异常:
try:
do_something()
except:
handle_exception()
finally:
do_cleanup()
如果在发生异常时仅运行清理,那么这样的事情可能会起作用:
should_cleanup = True
try:
do_something()
should_cleanup = False
except:
handle_exception()
finally:
if should_cleanup():
do_cleanup()
答案 1 :(得分:1)
您可以通过捕获所有错误来区分错误,并测试类似的类型:
try:
...
except (KeyError, ValuesError) as e :
cleanup_a()
cleanup_b()
cleanup_c()
if type(e) is KeyError:
handle_keyerror()
else:
handle_valueerror()
答案 2 :(得分:0)
如果except
块始终相同,您可以写:
try:
...
except (KeyError, ValueError) , e :
cleanup_a()
cleanup_b()
cleanup_c()
handle_keyerror()