3

我有一个要终止的循环KeyboardInterrupt

while True:
    try:
        do_stuff()
    except KeyboardInterrupt:
        cleanup()
        break
    except Exception as e:
        cleanup()
        raise e

这很好用,但cleanup()对我来说双重似乎很不干净。我不喜欢重复的代码。我尝试使用上下文管理器,但这引入了很多不必要的复杂性,并且文件大小几乎翻了一番。

有没有更简洁的方式来表达我的意图?

4

3 回答 3

5

您可以BaseException同时使用

try:
   do_stuff():
except BaseException as e:
    cleanup()
    if isinstance(e, KeyboardInterruption):
        break
    raise e

此外,您可以使用 onlyraise代替raise e

于 2012-11-28T11:39:07.160 回答
5

finally关键字正是您要查找的内容。关于错误和异常的文档解释了它的用法。

finally 子句总是在离开 try 语句之前执行,无论是否发生异常


如果清理只应该在离开循环时发生,我建议交换循环和 try :

try:
    while True:
        do_stuff()
except KeyboardInterrupt:
    pass
finally:
    cleanup()
于 2012-11-28T11:39:08.130 回答
1

听起来你想要这个finally子句:

while True:
  try:
    do_stuff()
  except KeyboardInterrupt:
    break
  finally:
    cleanup()

cleanup()将始终调用,无论是否引发或捕获异常。

于 2012-11-28T11:39:34.590 回答