更清洁的方式来处理python异常?

时间:2013-07-17 21:40:50

标签: python exception exception-handling

我正在清理一些代码,并遇到了一些情况,其中在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()

有人可以建议其他方法来解决这个问题吗?

3 个答案:

答案 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()