多次捕获相同异常的优雅方法是什么?

时间:2014-10-09 11:38:08

标签: python

我有一些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语句,我怎样才能实现相同的行为?

2 个答案:

答案 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之类的“精神跳跃”。