为什么TRY循环中的exit(0)会导致抛出异常?

时间:2016-08-05 19:21:27

标签: python-2.7 exception

考虑以下示例:

try:
     print "Try this."
     exit(0)
except:
     print "Failed."
     exit(1)

执行此简单示例时,将以下内容打印到stdout:

Try this.
Failed.

请原谅我,如果有明显的答案,或者已经有人问过,但为什么exit(0)(应该给我一个干净的退出)抛出异常?

我尝试在实际用例脚本中使用try: except:循环,并发现即使try条件说明为exit(0).

所以我猜exit(0)抛出某种(n隐藏?)异常,但为什么呢?它没有显示回溯(例如,当CTRL + C用于生成KeyboardInterrupt异常时),并导致意外行为,例如在我的情况下,我期待0返回并最终得到1回归。

退出python脚本的唯一方法是异常(任何异常)吗?

1 个答案:

答案 0 :(得分:1)

此处引发的异常是SystemExit例外。因此,如果你尝试:

try:
     print "Try this."
     exit(0)
except SystemExit:
     pass
except:
     print "Failed."
     exit(1)

输出是:

Try this.

为防止这种情况发生,您可以调用os._exit()直接退出,而不会抛出异常:

import os
try:
     print "Try this."
     os._exit(0)
except SystemExit:
     pass
except:
     print "Failed."
     os._exit(1)

引用user2357112

os._exit跳过最后的块,上下文管理器__exit__,退出处理程序和其他重要的清理,所以除了一些非常具体的案例(我相信大多数都涉及fork),它&#39 ;使用它不是一个好主意。