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

Reu*_*ben 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() 
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我只是试图做同样的事情,在Java中,其中finally的块在执行时System.exit(0)是在catch块.

NPE*_*NPE 76

一切sys.exit()都是提出类型的例外SystemExit.

文档:

退出Python.这是通过引发SystemExit 异常来实现的,因此遵循finally语句子句指定的清除操作try ,并且可以拦截外部级别的退出尝试.

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

import sys
try:
  sys.exit(0)
except SystemExit as ex:
  print 'caught SystemExit:', ex
Run Code Online (Sandbox Code Playgroud)

作为替代方案,os._exit()将停止绕过大部分清理的过程,包括finally块等.


Nil*_*lor 6

关于你的例子:

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

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