2016-02-26 98 views
0

我有一個問題,我需要有相同的一段代碼取決於兩個不同版本的PyGreSQL。問題是一個版本有一個異常錯誤(小寫)和另一個版本異常錯誤(大寫)。我怎樣才能妥善處理這件事。如果我有:Python處理未知類型仁慈

try: 
    do_something 
except pg.error, x: 
    print "Database connection error: ", x 
except pg.Error, x: 
    print "Database connection error: ", x 

那麼當它第一次通過差錯,不知道引發錯誤的錯誤,我總是遇到問題。 Python有沒有辦法處理這個問題?

我的意思是在C++中可以有預處理器條件來處理它,但在Python中我不知道如何。

這一切都歸功於一些無限智慧的人在某個地方改變版本之間的情況。

+0

你也可以用'pg.Error = pg.error'修補PyGrSQL的一個版本,特別是如果你認爲你去了以後放棄對一個版本的支持。 –

回答

2

你可以在導入過程中解決這個問題,這也將簡化代碼:

import pg 
try: 
    pgError = pg.error 
except AttributeError: 
    pgError = pg.Error 

再後來:

try: 
    ... 
except pgError, e: 
    print e 
0

你可以這樣說:

except getattr(pg, ("error", "Error")[hasattr(pg, "Error")]) as x: 

它使用的方便功能,使一個真正的價值是1和一個假值是0。這樣,如果pg具有名爲Error的屬性,則它使用getattr(pg, [("error", "Error")[1])),其簡化爲getattr(pg, "Error")pg.Error。如果是的話不是有這個屬性,通過同樣的簡化我們可以看到它使用了pg.error

+1

這很混亂,我不會在一個真實的項目中使用它。 –

+0

如果你堅持。 :(謝謝你實際上在說些什麼,而不是簡單地投票,如果是我的網站,我會規定每一個帖子上的投票應該附帶評論或者對其他人的評論進行投票。我的確有一個優點,但我可以看到你更喜歡另一種方法,我只是不明白爲什麼某個人不喜歡的方法應該被低估。我如何看待它,如果你不喜歡它,不要使用它。如果他們不回答這個問題,或者他們使用了一個非現場資源等,但是我咆哮,那麼他們應該被降低投票率。 – zondo

+0

你剛剛讓我感覺不好:-(我同意,評論就足夠了,對不起。 –

0

實際try..catch前實驗確定的異常類型:

try: 
    exception_type = pg.error 
except AttributeError: 
    exception_type = pg.Error 

try: 
    ... 
except exception_type: 
    ...