在Python 2.4中避免意外捕获KeyboardInterrupt和SystemExit

18
在Python脚本中,有很多情况下键盘中断(Ctrl-C)无法终止进程,因为代码中某处存在一个裸的except子句。
try:
    foo()
except:
    bar()
在Python 2.5或更高版本中的标准解决方案是捕获Exception而不是使用不带参数的except子句。
翻译后:

在Python 2.5或更高版本中,标准解决方案是捕获Exception而不是使用裸露的except子句:

try:
    foo()
except Exception:
    bar()

这段代码有效的原因是,在Python2.5及以上版本中,KeyboardInterruptSystemExit继承自BaseException而不是Exception。然而,一些安装仍在运行Python 2.4。在Python 2.5之前的版本中,如何处理这个问题?

(我将自己回答这个问题,并将其放在这里,以便搜索该问题的人可以找到解决方案。)


不要问问题只是为了自己回答。SO不是随机数据的维基百科;它是人们实际提出的问题的答案。 - Glenn Maynard
4
@Glenn Maynard: 猜测您是错误的:http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions - Curd
如果你在提问后找到了答案并回答自己的问题,那是可以的。但是仅仅为了回答自己的问题而提问则完全不同。 - Glenn Maynard
3
虽然不同,但并不一定违反规则精神。在meta上有很多关于这个问题的副本;这个链接中有许多有用的意见,包括对这个问题两侧都持有温和立场的一些观点:http://meta.stackexchange.com/questions/17463/ - Personman
3
很高兴看到这句话,因为它帮助了我。点个赞。 - Shabbyrobe
显示剩余2条评论
1个回答

14
根据Python文档,在Python 2.5之前的版本中正确处理此问题的方法是:
try:
    foo()
except (KeyboardInterrupt, SystemExit):
    raise
except:
    bar()

这很啰嗦,但至少是一个解决方案。


1
你应该将第二个 except 也改为 except Exception:,以避免捕获不应被捕获的其他异常。 - Thomas Wouters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接