Python 如何在异常时退出循环,但不重新引发每个异常类型?

Python 如何在异常时退出循环,但不重新引发每个异常类型?,python,exception-handling,Python,Exception Handling,我有一个循环要在键盘中断时终止: while True: try: do_stuff() except KeyboardInterrupt: cleanup() break except Exception as e: cleanup() raise e 这很好,但是双cleanup()对我来说似乎很不干净。我不喜欢重复的代码。我尝试改用上下文管理器,但这带来了很多不必要的复杂性,文件大小几

我有一个循环要在键盘中断时终止:

while True:
    try:
        do_stuff()
    except KeyboardInterrupt:
        cleanup()
        break
    except Exception as e:
        cleanup()
        raise e
这很好,但是双
cleanup()
对我来说似乎很不干净。我不喜欢重复的代码。我尝试改用上下文管理器,但这带来了很多不必要的复杂性,文件大小几乎增加了一倍


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

您可以使用
BaseException
来捕获这两种方法

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

此外,您只能使用
raise
而不是
raisee

关键字
finally
正是您要查找的。解释它的用法

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


如果清理只应在离开循环时进行,我建议交换循环并重试:

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

听起来您需要
finally
子句:

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

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

否,因为无论是否发生异常,
finally
都将运行。如何将while放在try中,以便仅在退出循环时(即,仅当出现错误时)才执行finally很好。对我来说,这似乎是最干净的解决方案。非常感谢。否,因为无论是否发生异常,
finally
都将运行
cleanup()
只应在退出循环时调用。出于我的特殊需要,
raise e
部分必须位于
else
部分中。不过,这是一个完美的解决方案。非常感谢。