Django使用try :,除了:

时间:2014-05-05 03:19:43

标签: python django python-2.7 exception-handling

我想知道是否有可能编写处理异常,例如2或更多,除非有不同的任务要做。

我正在使用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')

1 个答案:

答案 0 :(得分:3)

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

  

get_or_create(默认值=无,** kwargs)

     

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

     

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

这会将您的上述代码缩减为 -

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

我认为get_or_create会引发IntegrityErrorMultipleObjectsReturned来处理这些问题,只需将其包装在试试中:

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 e:
    raise e