2012-05-07 43 views
3

我想除了誘變劑引發的例外。但是,這裏有很多可能的例外。有什麼方法可以通配符(通過正則表達式/ etc)由except處理異常嗎?另一種方法是剛剛的fugly ...Python:嘗試...除了通配符外的例外名稱?

mutagen.apev2.APEBadItemError 
mutagen.apev2.APENoHeaderError 
mutagen.apev2.KeyError 
mutagen.apev2.ValueError 
mutagen.easyid3.EasyID3KeyError 
mutagen.easyid3.KeyError 
mutagen.easyid3.ValueError 
mutagen.flac.FLACNoHeaderError 
mutagen.flac.FLACVorbisError 
mutagen.flac.TypeError 
mutagen.id3.EnvironmentError 
mutagen.id3.EOFError 
mutagen.id3.ID3BadCompressedData 
mutagen.id3.ID3BadUnsynchData 

等:P

+1

一種方法是找出他們是否有一個共同的基類(他們似乎來自一個庫,所以這是可能的)。然後,您可以捕獲基類,並且如果exc是inherited_exc:#...'則通過派生類。 – phg

+0

等一下,我在想c#(早點在這裏)。這應該是'if isinstance(exc,inherited_exc_type)',例如'isinstance(ex,mutagen.flac.TypeError)' – phg

回答

4

還有的會是一個更小的fugly方式,但它仍然是一個輕微的疼痛,每次這些模塊的實現了「錯誤」的是所有相關的錯誤都來自於。

# Please note, the exception class truly is lower cased as indicated 
mutagen.id3.error 
mutagen.flac.error 
mutagen.apev2.error 

# mutagen.easyid3 errors extend the mutagen.id3.error class 
+0

謝謝;至少可以把它縮小很多。 :D – BrianFreud

+0

設計選擇在不同模塊中爲不同的「錯誤」類子類化是非常奇怪的。想知道他們爲什麼不僅僅繼承一個Exception基類。 – jdi

+0

他們絕對做了子類異常,他們只是將其命名爲錯誤:) – Bryan

2

這是很醜陋過,但如果你需要攔截一個大的,非常異質組的異常類似的東西可能的情況下可行的選擇。至少它將其他地方的例外情況排除在外。

>>> errors = {NameError:'a', ValueError:'b'} 
>>> try: 
...  cornucopia 
... except Exception as e: 
...  e_type = type(e) 
...  if e_type in errors: 
...   print errors[e_type] 
...  else: 
...   raise 
... 
a 

顯然這是要儘量避免; Bryan Moyles的解決方案可能更適合您的特定情況。儘管如此,我想我會提到它。