我想使用两个不同的例外:
class toto:
def save():
try:#gestion du cours
cours = Cours.objects.get(titre=self.titre, date=old_date)
cours.date = self.date
cours.save()
except Cours.DoesNotExist:
Cours.objects.create(titre=self.titre, date=self.date, valeur=self.cours)
except IntegrityError:
pass
但它不起作用。 为什么?
编辑:固定意图
答案 0 :(得分:1)
我想我知道会发生什么,IntegrityError
正在异常部分中提出。
尝试这样可以解决您的问题:
def save():
try: #gestion du cours
cours = Cours.objects.get(titre=self.titre, date=old_date)
cours.date = self.date
cours.save()
except Cours.DoesNotExist:
try:
Cours.objects.create(titre=self.titre, date=self.date, valeur=self.cours)
except IntegrityError:
pass
答案 1 :(得分:1)
这扩展了@ arie的评论。
def save():
obj,created = Cours.objects.get_or_create(titre=self.titre, date=old_date)
if created:
obj.date = self.date
obj.save()
使用给定的kwargs查找对象的便捷方法, 必要时创建一个。
返回(object,created)的元组,其中object是检索到的或 创建的对象和创建的是一个布尔值,指定是否为新的 对象已创建。
如果你想要捕捉IntegrityError
,只需将其包裹在try:
try:
obj,created = Cours.objects.get_or_create(titre=self.titre, date=old_date)
if created:
obj.date = self.date
obj.save()
except IntegrityError:
# do something
答案 2 :(得分:0)
异常中的逻辑是如果在try
块中抛出异常,则尝试捕获是级联的。在你的情况下,它是这样的:
if try... throws an exception then:
if exception is Cours.DoesNotExist then:
Cours.objects.create(...)
else if exception is IntegrityError then:
pass
这是你想要的吗?
答案 3 :(得分:0)
首先,在:
和def toto
之后,您遗失了def save()
。缩进也是错误的。
最好先测试Cours.DoesNotExist
,如果需要,在try块中创建。我不确定你的Cours是如何工作的,但更像是这样:
class toto:
def save():
try:#gestion du cours
try:
cours = Cours.objects.get(titre=self.titre, date=old_date)
except Cours.DoesNotExist as e:
print("trying to create " self.titre)
Cours.objects.create(titre=self.titre, date=self.date, valeur=self.cours)
# I guess you need this again now:
cours = Cours.objects.get(titre=self.titre, date=old_date)
cours.save()
cours.date = self.date
except Cours.DoesNotExist as e:
print("not even at second try: ",e)
raise
except IntegrityError:
pass
except BaseException as e:
print(" re-raise of some exception: ",type(e),e)
raise
请注意,如果一个测试异常来自另一个异常,则捕获异常的顺序很重要。