2012-02-02 59 views
0

我想用两个不同的例外:多个除了一个尝试

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 

,但它不工作。 为什么?

编辑:固定intentation

+1

你能解释一下什么不是工作?你是否试图在相同的情况下处理这两个异常?还是你说有这些多个异常声明不起作用? – jdi 2012-02-02 23:20:29

+0

正如所写,这不是有效的代码。你是否从你的实际代码中剪切和粘贴?你是从前两行获得语法错误,还是你有其他问题? – 2012-02-02 23:34:43

+0

也许你想保存新创建的Cours对象? – WolframH 2012-02-03 00:54:40

回答

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: 
    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 
+0

正是我所需要的 – francois 2012-02-05 20:29:31

0

在例外的逻辑是,如果一个异常在try块抛出,然后尝试捕获在级联制成。在你的情况,这是这样的:

if try... throws an exception then: 
    if exception is Cours.DoesNotExist then: 
     Cours.objects.create(...) 
    else if exception is IntegrityError then: 
     pass 

这是你想要的?

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 
+0

这是一个有趣的事情,他可能会试图做。我没有想到他实际上试图在create()方法上捕获异常 – jdi 2012-02-02 23:34:37

+0

另外请注意,这种情况有一个快捷方式:https://docs.djangoproject.com/en/dev/ref/ models/querysets /#get-or-create – arie 2012-02-03 05:55:56

0

首先def totodef save()后之后,你已经失踪:。缩进也是错误的。

最好先测试Cours.DoesNotExist,如果需要在try块内创建。我不知道你的赛道是如何工作的,但更多的东西是这样的:

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 

注意的顺序,你捕获的异常问题,如果一个测试异常是从另一个类。