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
部分中。不过,这是一个完美的解决方案。非常感谢。