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

hed*_*gie 6 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
Run Code Online (Sandbox Code Playgroud)

请注意,我试图捕获的异常每次都是相同的.当然必须有一种方法可以做到这一点,而无需不必要的重复和嵌套.如果没有嵌套的try ... except语句,我怎样才能实现相同的行为?

Ned*_*der 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
Run Code Online (Sandbox Code Playgroud)

It's not clear what exception you want to raise if you never find what you want, you might have to adjust that part. Also, the scoping of exception values has changed in Python 3, so e won't be available to raise.


geo*_*org 5

当包装到函数中时,嵌套和复杂的控制块更容易阅读:

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
Run Code Online (Sandbox Code Playgroud)

这样您就可以避免过度缩进和“精神跳跃”,例如break/ continue