2016-03-30 124 views
0

下面是從python documentation處理的異常處理和類的代碼的示例片。我正在努力理解這兩者,並且我的背景是用Java編寫的,所以我習慣強類型化類和變量。請有人詳細解釋這裏發生了什麼?Python的例外(文檔實施例)

class B: 
    pass 
class C(B): 
    pass 
class D(C): 
    pass 

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

前六行是實際創建B,C和D實例還是隻創建一個類類型。如果他們只是班級類型,我認爲他們是在for c in [B, C, D]:。類C和D的實例如何在沒有參數的情況下實例化?那麼異常事情是怎麼回事?

回答

1

前六行創建類。我喜歡將它們視爲將在以後創建的實例的定義。使用for c in [B, C, D]:確實不是實例化任何東西;它只是分配c到每個BCD它仍然只是類。對於第一次迭代,cB是一樣的。因此,當您說raise c()時,c()會生成B的一個實例並將其作爲例外引發。該例外被捕獲在except B:塊中,並導致print "B"行執行。對於下一次迭代,將c分配給[B, C, D]中的下一個值:C。現在,raise c()作爲C的實例並引發它作爲例外。在except C:塊中執行該例外,並執行print "C"行。 D發生同樣的事情。

1

前六個行定義的類。它們沒有參數實例化,因爲例如class C(B):意味着類C繼承B,而不是C該實例需要傳遞參數。這在documentation on classes中有解釋。

通過每一次循環中,解釋將提高定類的錯誤。它將打印提出的任何類型的異常類別,其中BB等等。正如您在運行代碼時看到的那樣,輸出爲B,然後是C,然後是D,因爲那些是按順序提出的異常類,如您在循環迭代的[B, C, D]中看到的那樣。

0

前六行是創建類的類型。

因爲python中的所有東西都可以分配給一個變量,所以它包括函數,類(不只是該類的實例化對象)for c in [B, C, D]:正在做的事情。

最後,例外在try:中首先要做的是通過創建它的一個實例來嘗試引發類型爲c的例外。因此,第一提升乙類型的異常然後鍵入C,然後輸入D.

except s爲有捕捉這些例外,對於每種類型。在python 2中,任何對象都可以作爲異常引發,這與python 3不同,其中引發的所有異常必須從BaseException類型派生出來