代码之家  ›  专栏  ›  技术社区  ›  sleblanc

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

  •  1
  • sleblanc  · 技术社区  · 12 年前

    我处理了一些代码,遇到了一个特殊的问题:

    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 异常,因为该字段在我的数据库中不是唯一的。我想知道我怎么能干净地接住 多个对象返回 而“else”语句仍将被执行。

    2 回复  |  直到 11 年前
        1
  •  2
  •   nneonneo    12 年前

    或者,不要使用 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)
    
        2
  •  2
  •   sleblanc    12 年前

    简单的解决方案:诀窍是陷阱 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
    

    第二个“naive”方法不起作用的原因是,如果捕捉到异常,解释器将不会通过 else: 条款相反,它会悄无声息 return