2016-02-26 51 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: 
    ...