【问题标题】:django try exception statement causing IntegrityError:django try 异常语句导致 IntegrityError:
【发布时间】:2011-05-03 07:55:34
【问题描述】:

我们在我们的系统上使用 paypal 来检查用户是否之前付款并已经拥有一个帐户。 今天早上我收到了一个基本上给我一个完整性错误的回溯。

IntegrityError: (1062, "Duplicate entry 'user_1234_before' for key 2")

我的声明如下。

try:
    user = User.objects.get(email=ipn_obj.payer_email)
except:
    user_slug = ("%s_%s_before") % (ipn_obj.first_name, ipn_obj.last_name)
    username = slugify(user_slug)
    user = User.objects.create_user(username, ipn_obj.payer_email, 'testpassword')
    user.first_name = ipn_obj.first_name
    user.last_name = ipn_obj.last_name
    user.save()

提前致谢。

【问题讨论】:

  • except 语句捕获到什么异常?

标签: django django-views


【解决方案1】:

永远不要使用空白的except 语句。这里发生的事情很好地说明了原因。

您可能已经使用该 try/except 块来捕获 User.DoesNotExist 异常。但是,您的代码实际上引发了一个完全不同的异常。因为你正在吞下它,所以不可能知道是哪一个,但可能ipn_obj 不是你认为的那样,并且没有payer_email 错误,所以你得到AttributeError。或者,您可能会收到 User.MultipleObjectReturned 异常。

将您的except 更改为except User.DoesNotExist,然后调试您的实际问题。

【讨论】:

  • 但是这个异常是由User.objects.create_user(...)而不是User.objects.get(...)提出的
  • 是的,因为他不应该进入except 块。
【解决方案2】:

我认为您有两个用户,payer_mail 不同但first_namelast_name 相同:username(由名字和姓氏组成)对于两个用户来说是相同的。可能usernameUser 上的唯一键并给您错误。

除了捕获正确的异常 (User.DoesNotExist),如果您想保留您的代码,我认为您应该使用电子邮件字段“唯一化”username(我认为这是唯一的):

user_slug = ("%s_%s_before") % (ipn_obj.first_name, ipn_obj.last_name)

与:

user_slug = ("%s_%s_%s_before") % (ipn_obj.first_name, ipn_obj.last_name, ipn_obj.payer_email)

或:

user_slug = ("%s_before") % (ipn_obj.payer_email)

【讨论】:

    【解决方案3】:

    这个异常实际上是由一个已经使用用户名的用户的创建(即 INSERT 语句)引发的。 在进行此插入之前,您应检查其是否存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多