为何在异常处理块中调用sys.exit(0)后finally块仍然执行?

49 投票
2 回答
20101 浏览
提问于 2025-04-17 04:00

我刚接触Python,想知道为什么在except块中调用sys.exit(0)后,finally块还是会执行?

代码:

import sys

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

divide_by_zero() 

顺便说一下,我其实是想做和Java一样的事情,在Java中,当System.exit(0)catch块中时,finally块是不会执行的。

2 个回答

10

你应该使用 os._exit(0)

关于你的例子:

不管有没有发生错误,finally 语句块总是会在离开 try 语句之前执行。

这段话来自 Python 文档中的 错误和异常部分。所以,在你展示的例子中,除非你使用 os._exit(0),否则你的 finally 代码块总是会被执行。不过,使用它的时候要谨慎...

98

其实,sys.exit() 这个函数的作用就是抛出一个叫做 SystemExit 的异常。

根据文档的说明:

这个函数是用来退出Python程序的。它通过抛出 SystemExit 异常来实现,因此在程序中用 try 语句的 finally 块中指定的清理操作会被执行,而且你还可以在外层捕获这个退出的尝试。

如果你运行下面的代码,你就能亲自体验一下:

import sys
try:
  sys.exit(0)
except SystemExit as ex:
  print 'caught SystemExit:', ex

另外,os._exit(n) 这个函数可以直接停止程序,并且会跳过很多清理操作,包括 finally 块等。

撰写回答