Python:如何在处理其他异常时忽略异常

时间:2012-09-26 20:45:09

标签: python django exception exception-handling

我正在搞乱一些代码并面临一个特定的问题:

def find_available_slug(object, instance, slug)
    try:
        sender_node = object.objects.get(slug=slug)
    except object.DoesNotExist:
        instance.slug = slug
    else:
        slug = '%s_' % slug
        find_available_slug(object, instance, slug)
    return

我遇到的问题是,有时objects.get(slug=slug)会抛出MultipleObjectsReturned异常,因为该字段在我的数据库中不是唯一的。我想知道如何能够干净地抓住MultipleObjectsReturned,而“else”语句仍会被执行。

2 个答案:

答案 0 :(得分:2)

简单解决方案:诀窍是在调用MultipleObjectsReturned方法时将try陷入第二个get语句中。这样,不会引发异常并且正常执行。

使用:

def find_available_slug(object, instance, slug)
    try:
        try:
            sender_node = object.objects.get(slug=slug)
        except object.MultipleObjectsReturned:
            pass
    except object.DoesNotExist:
        instance.slug = slug
    else:
        slug = '%s_' % slug
        find_available_slug(object, instance, slug)
    return

不起作用:

def find_available_slug(object, instance, slug)
    try:
        sender_node = object.objects.get(slug=slug)
    except object.MultipleObjectsReturned:
        pass
    except object.DoesNotExist:
        instance.slug = slug
    else:
        slug = '%s_' % slug
        find_available_slug(object, instance, slug)
    return

第二个“天真”方法不起作用的原因是如果捕获到异常,解释器将不会通过else:子句。它会默默地return

答案 1 :(得分:2)

或者,根本不要使用else子句:

def find_available_slug(object, instance, slug)
    try:
        sender_node = object.objects.get(slug=slug)
    except object.DoesNotExist:
        instance.slug = slug
        return
    except object.MultipleObjectsReturned:
        pass

    slug = '%s_' % slug
    find_available_slug(object, instance, slug)