Django 中使用 try: 和 except:
我在想,是否可以像使用两个或更多的except那样来处理异常,并为每个except做不同的事情。
我正在使用 Django==1.6.1
和 Python 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 个回答
13
你可以使用多个 try: except:
来处理错误,但在你现在的情况中,为什么不试试 get_or_create
呢?
try: except: 可以捕捉所有的错误,'Exception' 是所有错误的总称,这种写法就是这样。
except Exception as e:
get_or_create(defaults=None, **kwargs)
这是一个方便的方法,用来查找一个对象,使用给定的参数(如果你的模型对所有字段都有默认值,这些参数可以为空),如果找不到就创建一个。
这个方法返回一个元组,包含 (对象, 是否创建),其中对象是查找到或创建的对象,是否创建是一个布尔值,表示是否新创建了一个对象。
这样可以简化你上面的代码 -
obj, created = foo.objects.get_or_create(field_name='unknown')
if created:
obj.save()
我认为 get_or_create
会抛出 IntegrityError
或 MultipleObjectsReturned
这样的错误,要处理这些错误,只需把它放在 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