我正在搞乱一些代码并面临一个特定的问题:
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
异常,因为该字段在我的数据库中不是唯一的。我想知道如何能够干净地抓住MultipleObjectsReturned
,而“else”语句仍会被执行。
答案 0 :(得分:2)
简单解决方案:诀窍是在调用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
第二个“天真”方法不起作用的原因是如果捕获到异常,解释器将不会通过else:
子句。它会默默地return
。
答案 1 :(得分:2)
或者,根本不要使用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)