用 `try except` 尝试两个表达式

I15*_*159 7 python sqlalchemy try-except

我有两个表达。我需要尝试一个表达式,如果它引发异常尝试另一个,但如果第二个也引发异常 - 引发异常。

我试过这个,但它看起来很丑,我不确定这是解决这个问题的最佳方法:

try:                                                           
    image = self.images.order_by(func.random()).limit(1)       
except:                                                        
    try:                                                       
        image = self.images.order_by(func.rand()).limit(1)     
    except ProgrammingError:                                   
        raise ProgrammingError(                                
            'The database engine must be PostgtreSQL or MySQL')
Run Code Online (Sandbox Code Playgroud)

你怎么做呢?

kin*_*all 5

使用循环:

for methname in ("random", "rand"):
    try:
        image = self.images.order_by(getattr(func, methname)()).limit(1)
        break
    except ProgrammingError:
        continue
else:
    raise ProgrammingError("The database engine must be PostgtreSQL or MySQL")
Run Code Online (Sandbox Code Playgroud)

else只有当循环正常终止(即没有 a break)时才会执行循环的子句,这就是我们break在进行image赋值之后的原因。如果您认为这太棘手,因为该else子句很少与 一起使用for,那么这也适用:

image = None
for methname in ("random", "rand"):
    try:
        image = self.images.order_by(getattr(func, methname)()).limit(1)
    except ProgrammingError:
        continue
if not image:
    raise ProgrammingError("The database engine must be PostgtreSQL or MySQL")
Run Code Online (Sandbox Code Playgroud)


Ole*_*pin 5

制作一个单独的函数非常有帮助。

def get_random_image(self):
    for rand in func.random, func.rand:
        try:                                                           
            return self.images.order_by(rand()).limit(1)
        except ProgrammingError:                                                        
            pass
    raise ProgrammingError('This database engine is not supported')
Run Code Online (Sandbox Code Playgroud)