Django 使用 try: 和 except:

Cha*_*iam 3 python django exception-handling python-2.7

我想知道是否可以编写一个处理异常的方法,例如 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')
Run Code Online (Sandbox Code Playgroud)

Sri*_*aju 8

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

尝试:期望:包含“异常”上的所有错误。因为这个语法就是全部

except Exception as e:
Run Code Online (Sandbox Code Playgroud)

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

我认为get_or_createraiseIntegrityErrorMultipleObjectsReturned, 来处理那些简单地将它包装在一个 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
Run Code Online (Sandbox Code Playgroud)

  • 扩展使用get_or_create,很好解释。Thx Srikar Appal (2认同)