多次尝试除外

时间:2012-02-02 23:12:58

标签: python django

我想使用两个不同的例外:

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

但它不起作用。 为什么?

编辑:固定意图

4 个答案:

答案 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()

来自documentation

  

使用给定的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 

请注意,如果一个测试异常来自另一个异常,则捕获异常的顺序很重要。