1

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

任何人都可以提出替代方法来解决这个问题吗?

4

3 回答 3

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()
于 2013-07-17T21:46:43.870 回答
1

您可以通过将所有错误捕获到相同的异常中来区分错误,并像这样测试类型:

try:
    ...
except (KeyError, ValuesError) as e :
    cleanup_a()
    cleanup_b()
    cleanup_c()
    if type(e) is KeyError:
        handle_keyerror()
    else:
        handle_valueerror()
于 2013-07-17T21:50:14.807 回答
0

如果except块总是相同的,你可以写:

try:
    ...
except (KeyError, ValueError) , e :
    cleanup_a()
    cleanup_b()
    cleanup_c()
    handle_keyerror()
于 2013-07-17T21:48:57.367 回答