为什么finally块在调用除块之外的sys.exit(0)后执行?

时间:2011-10-10 06:56:36

标签: python

我是Python的新手。我只是想知道在finally块中调用sys.exit(0)except块执行的原因是什么?

代码:

import sys

def sumbyzero():
    try:
        10/0
        print "It will never print"
    except Exception:
        sys.exit(0)
        print "Printing after exit"
    finally:
        print "Finally will always print"

sumbyzero() 

顺便说一句,我只是尝试做与Java中相同的事情,当finallySystem.exit(0)中时,catch 执行<{1}}阻止。

2 个答案:

答案 0 :(得分:72)

所有sys.exit()都会引发类型SystemExit的异常。

来自documentation

  

退出Python。这是通过提高SystemExit来实现的   异常,因此finally的{​​{1}}子句指定的清除操作   声明被尊重,并且可以拦截出口   尝试在外层。

如果你运行以下内容,你会亲眼看到:

try

作为替代方案,os._exit()将阻止此过程绕过大部分清理,包括import sys try: sys.exit(0) except SystemExit as ex: print 'caught SystemExit:', ex 块等。

答案 1 :(得分:6)

关于你的例子:

  

在离开try语句之前总是执行finally子句,   是否发生了例外。

这是来自Python文档的Error and Exceptions部分。所以 - 除非你使用os._exit(),否则你的finally块将始终在你展示的例子中执行。但你应该明智地使用它......

相关问题