Django使用try:和except:

8

我想知道是否可以像使用2个或更多不同任务的except一样编写处理异常。

我正在使用Django==1.6.1Python 2.7

try:
    foo_instance = foo.objects.get(field_name='unknown')

except foo.DoesNotExist:
    new_rec = foo.objects.create(field_name='unknown')
    new_rec.save()

    foo_instance = foo.objects.get(field_name='unknown')

except foo.MultipleObjectsReturned:
    foo_list = foo.objects.filter(field_name='unknown')
    for record in foo_list[1:]:
       print 'Deleting foo id: ', record.id
       record.delete()

    foo_instance = foo.objects.get(field_name='unknown')

这仍然是Python,你可以做到。您提供的代码有问题吗? - alecxe
https://dev59.com/t2025IYBdhLWcg3wSj8q - sfletche
谢谢alecxe。回溯指向第二个except行。 - Charlesliam
但最终找到了我的错误原因。foo_list 的原始代码是 em_list = EquipModel.objects.filter(make=ppp_detail[i]))。它有一个额外的右括号。>< - Charlesliam
抱歉,sfletche..无法找到该链接。感谢提供的链接。 - Charlesliam
我在想为什么我的“DoesNotExist”异常没有生效...看起来需要这样写:except {{Model}}.DoesNotExist:,其中{{Model}}是我们正在处理的模型的名称。感谢您添加此示例,帮助我解决了困境! - twknab
1个回答

12
你可以使用多个 try: except:,但在您当前的情况下,为什么不使用get_or_create

try: expect: 包含所有关于 'Exception' 的错误。对于这个语法来说是全部的。
except Exception as e:

get_or_create(defaults=None, **kwargs)

这是一个便捷的方法,用于查找具有给定kwargs的对象(如果您的模型对所有字段都有默认值,则可能为空),必要时创建一个对象。

返回一个元组(object, created),其中object是检索或创建的对象,created是一个布尔值,指示是否创建了新对象。

这将简化您上面的代码 -

 obj, created = foo.objects.get_or_create(field_name='unknown')
 if created:
     obj.save()

我认为 get_or_create 可能会触发 IntegrityErrorMultipleObjectsReturned 异常,为了处理这些异常可以使用 try 包裹该方法:

try:
    obj, created = foo.objects.get_or_create(field_name='unknown')
    if created:
        obj.save()
except IntegrityError: 
    #do something
except MultipleObjectsReturned:
    #do something else
except Exception as e:
    raise e

2
广泛使用get_or_create,做出很好的解释。谢谢Srikar Appal。 - Charlesliam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接