несколько, кроме одной попытки - PullRequest
0 голосов
/ 03 февраля 2012

Я хочу использовать два разных исключения:

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 ]

1 голос
/ 03 февраля 2012

Это расширяет комментарий @ 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, создавая его при необходимости.

Возвращает кортеж (объект, созданный), где объект - это извлеченный или созданный объект, а созданный логический объект, определяющий, был ли создан новый объект.1013 * Если вы хотите поймать 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
1 голос
/ 03 февраля 2012

Мне кажется, я знаю, что может происходить, 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 голосов
/ 03 февраля 2012

Прежде всего, вам не хватает : после после def toto и def 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 

Обратите внимание, что порядок, в котором вы ловите исключения, имеет значение, если одно проверенное исключение получено из другого.

0 голосов
/ 03 февраля 2012

Логика в исключении состоит в том, что если исключение выдается в блоке try, то попытки захвата предпринимаются каскадно.в вашем случае это так:

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

Это то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...