2011-06-01 31 views
7

假設我正在使用庫X,該庫指定例如exception.BaseErrorX的所有例外的基類。確定要在Python中捕獲哪些例外

現在,還有另外一個例外,比如說X.FooError,它當然是從exception.BaseError繼承的,但是更通用一些,比方說它處理無效輸入。我們假設還有很多其他的類,從BaseError開始,但是對於一般情況都是如此。

X 
| 
BaseError 
| 
FooError 

所以我想然後檢查無效輸入。那麼我應該抓住哪個例外?當然,捕捉每個單獨的異常是不可能的,所以我趕上X.BaseError,然後打印一條錯誤消息。或者我可以專門找到X.FooError,但後來我錯過了所有其他的錯誤情況。

這是做到這一點的標準方式 - 捕捉基本異常?如果是,那麼爲什麼還存在其他例外情況?對於我們想要捕捉特定異常的廣義情況?

回答

10

僅捕獲您可以處理的異常。如果你可以處理基本異常和派生異常,那麼同時捕獲這兩個異常。但確保首先放置派生異常,因爲第一個異常處理程序發現匹配是使用的異常。

try: 
    X.foo() 
except X.FooError: 
    pass 
except X.BaseError: 
    pass 
+0

但是爲什麼抓住派生的一個,當基地可以處理一切? – user225312 2011-06-01 10:50:34

+0

因爲您可能想要以與基本異常不同的方式處理派生異常。 – 2011-06-01 10:52:19

+1

但是,如果我不想以不同的方式處理特定異常,那麼是否使用基本異常類呢? – user225312 2011-06-01 10:53:24

3

像往常一樣,在PEP-8很好的意見,風格指南Python代碼:

當捕捉異常,具體例外儘可能而是採用了裸except:條款。

這裏還有很多東西,但在這裏再現它沒有意義。

在這種情況下,我會趕上的細節,都被我以不同的方式處理它們的BaseErrorBaseError對於那些需要更多的一般處理。但是,我會停下來抓住內置的Exception

+0

請注意,我從來沒有說過一個「except」條款。我詢問了捕獲基類「BaseError」與更一般化的「FooError」之間的區別。 – user225312 2011-06-01 10:50:14

+0

@A A:我在編輯的過程中當你評論:-) – Johnsyweb 2011-06-01 10:52:57

2

您可以通過定義它的except子句中,從而搭上specfic例外:

try: 
    #do stuff 
except X.FooError: 
    # handle the error 
except (X.AnotherError, x.YetAnotherError), exc: 
    print 'I'm handling %s' % exc 

通知您可以通過在一個元組中列出這些處理多個異常類。

+0

感謝您的回答,請在Ignacio的回答中看到我的評論。 – user225312 2011-06-01 10:50:56

+0

@A A:沒問題; @Ignacio打敗了我 – 2011-06-01 11:10:26