2011-11-14 52 views
2

我的品牌新的Python,並需要一些幫助理解的代碼段:能否請您解釋一下這個代碼片段在python

for c in [B, C, D]: 
    try: 
     raise c() 
    except D: 
     print "D" 
    except C: 
     print "C" 
    except B: 
     print "B" 

閱讀python文檔,似乎raise()拋出一個異常,但我可以不知道爲什麼raise()try區塊內。它不應該是這樣的:

try: 
    //do something 
catch: 
    raise() 
+0

不知道代碼應該完成什麼,100%不可能知道哪個版本是正確的。 –

回答

2

raise是如何引發異常的第一個地方。異常處理程序中的唯一raise僅將異常傳播到外部處理程序。

+0

ohh,gotcha。那麼,根據'c'的值,try塊中的代碼本質上會引發一個異常? – xbonez

+2

它在'c'中引發異常類的一個實例。 –

+0

在Python中,一切都是一個對象 - 包括類本身。 'c'這個名字依次被綁定到每個類。 'c()'每次通過循環創建一個相應的異常類的實例,然後'raise'd。 –

1

該代碼有點荒謬,因爲它是一種奇怪的做事方式,但它很清楚發生了什麼。列表[B, C, D]是一個例外列表。由於例外是raise d在try塊,則立即由適當except處理程序處理(在連續,所述except B:except C:except D:處理程序

因此,該代碼相當於:

print "B" 
print "C" 
print "D" 

除了會拋出(未捕獲)異常,如果任何的BCD也不例外。

+0

是的,這有點荒謬。它是一個基本的python類的一部分,所以它不會實現除了解釋python中的異常處理概念之外的任何事情。 – xbonez

2

我相信加薪()直接放在裏面嘗試:僅僅是爲了說明。 即使通常你會把代碼引起異常(即一個包含raise())的內部嘗試,不是嗎?

+1

是的,你說得對。再想一想,我意識到在'try'塊中提出異常是有意義的 – xbonez