我有一些Python代码在尝试数据库为空并放弃之前尝试了一堆不同的数据库查询。这是一个简化的例子:
try:
result = Object.get(name="requested_object")
except Object.DoesNotExist:
try:
result = Object.get(name="default_object")
except Object.DoesNotExist:
try:
result = Object.get(pk=1)
except Object.DoesNotExist:
print "The database is empty!"
raise
请注意,我每次尝试捕获的异常都是相同的。当然必须有一种方法可以做到这一点,而无需不必要的重复和嵌套。如果没有嵌套的try ... except语句,我怎样才能实现相同的行为?
答案 0 :(得分:7)
for args in [{'name':"requested_object"}, {'name':"default_object"}, {'pk':1}]:
try:
result = Object.get(**args)
except Object.DoesNotExist as e:
continue
else:
break
else:
raise e
如果你从未找到你想要的东西,你不清楚你要提出什么例外,你可能需要调整那部分。此外,Python 3中的异常值范围已更改,因此e
无法提升。
答案 1 :(得分:2)
嵌入函数时,嵌套和复杂的控件块更易于阅读:
def result():
try:
return Object.get(name="requested_object")
except Object.DoesNotExist:
pass
try:
return Object.get(name="default_object")
except Object.DoesNotExist:
pass
return Object.get(pk=1) # NB: no "try" here. If it's going to fail, let it fail
这样可以避免过度缩进和break
/ continue
之类的“精神跳跃”。