为何在异常处理块中调用sys.exit(0)后finally块仍然执行?
我刚接触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
块等。