2011-10-10 86 views
28

我是Python新手。我只是想知道爲什麼finally塊在except塊中調用sys.exit(0)後正在執行?爲什麼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中,其中finally塊執行System.exit(0)catch塊。

回答

60

全部sys.exit()確實引起了SystemExit類型的例外。

documentation:從Python的

退出。這是通過提高SystemExit 例外來實現的,因此try 語句的finally條款指定的清理操作將得到遵守,並且可以攔截在外層嘗試的退出 。

如果您運行以下,你會看到自己:

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

作爲替代,os._exit()將停止過程繞過大部分的清理,包括finally塊等

+0

+1對你的很好的解釋@艾克斯 – Reuben

4

關於你的例子:

finally語句總是在離開try語句之前執行, 是否發生異常。

這是從Error and Exceptions Python文檔的一部分。因此 - 除非您使用os._exit(),否則您的finally塊將始終在您展示的示例中執行。但你應該明智地使用它...

相關問題