2011-04-19 109 views
11

isinstance(SystemExit(1), Exception) evals to True,但是這段代碼打印"caught by bare except SystemExit(1,)"爲什麼「Exception Exception」不能捕獲SystemExit?

try: 
    sys.exit(0) 
except Exception, e: 
    print 'caught by except Exception', str(e) 
except: 
    print 'caught by bare except', repr(sys.exc_info()[1]) 

我的測試環境是Python 2.6。

+0

你真的檢查你的聲明 「'isinstance(SystemExit(1),例外)'evals爲True」 關於Python 2.6? – Anthon 2014-05-22 07:13:33

回答

13

isinstance(SystemExit(1), Exception) 在Python 2.6上是False的。自Python 2.4以來,此版本的Python中的異常層次結構發生了變化。

E.g. KeyboardInterrupt不再是Exception的子類。

查看更多信息http://docs.python.org/release/2.6.6/library/exceptions.html#exception-hierarchy

+4

PEP 352提供了基本原理:http://www.python.org/dev/peps/pep-0352/#exception-hierarchy-changes – ncoghlan 2011-04-19 15:20:35

+0

呵,並且GeneratorExit隨後在2.6中移動,以直接從BaseException繼承,因爲它是一個某些風格的基於生成器的編程中的「系統退出」異常。 – ncoghlan 2011-04-19 15:23:25

8

你的錯誤是在你的問題的第一句:

>>> isinstance(SystemExit(1), Exception) 
False 

SystemExit不是Exception一個子類。

+2

謝謝,我發現真正的錯誤,是在Python 2.3中,'isinstance(SystemExit(1),Exception)'是真的。而在Python 2.3中,測試代碼打印'「,除了Exception」'被捕獲。對於Python 2.6,這是正確的。 – 2011-04-19 10:31:03

相關問題