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)
你怎么做呢?
使用循环:
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)
制作一个单独的函数非常有帮助。
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)
| 归档时间: |
|
| 查看次数: |
7898 次 |
| 最近记录: |