【问题标题】:python 3.6 mongoengine cannot catch exceptionpython 3.6 mongoengine 无法捕获异常
【发布时间】:2016-06-21 05:03:08
【问题描述】:

我有一个 django 1.9 项目并且正在使用 mongoengine 连接到 mongodb 实例。

我有一个模型如下:

from django.db import models
from mongoengine import * 
class Employee(Document):
    email = StringField(required=True, unique=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)

一个测试类:

import web.models as models
class test:

    '''Test the accessibility of the business class'''
    def testBusiness():
        employee = models.Employee.objects.create(
            email="pedro.kong@company.com",
            first_name="Pedro",
            last_name="Kong"
        )
        try:
            employee.save()
        except pymongo.errors.DuplicateKeyError as e:
            return "Error"
        return "Business Tested"

问题是我无法捕捉到DuplicateKeyError execption:

pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: rockynode.employee.$email_1  dup key: { : "pedro.kong@company.com" }

我尝试了全局尝试,但它仍然使代码崩溃并出现DuplicateKeyError 异常:

try:
    employee.save()
except:
    return "Error"
return "Business Tested"

关于使用以下依赖项的信息:​​

Django==1.9.7
mongoengine==0.10.6
pymongo==3.2.2

参考:get-the-duplicate-value-on-duplicatekeyerror

任何帮助都将不胜感激。谢谢。

【问题讨论】:

    标签: python django python-3.x mongoengine pymongo-3.x


    【解决方案1】:

    正如您在文档中看到的那样,create 返回一个保存的文档,所以如果您使用它

    • 您不必再次保存它
    • 你必须在那里捕获保存异常

      try:
          employee = models.Employee.objects.create(
              email="pedro.kong@company.com",
              first_name="Pedro",
              last_name="Kong"
          )
      except Exception as e:
          return "Error \n %s" % (e)
      return "Business Tested"
      

    或者如果您不使用创建但保存在单独的语句中:

        employee = models.Employee(
            email="pedro.kong@company.com",
            first_name="Pedro",
            last_name="Kong"
        )
        try:
            employee.save()
        except Exception as e:
            return "Error \n %s" % (e)
        return "Business Tested"
    

    【讨论】:

      【解决方案2】:

      我必须解决这个问题。

      try except 不起作用,因为 DuplicateKeyError exception 不是从 save() 方法触发的,而是从 create() 方法触发的。

      引用文档:create()

      创建新对象。返回保存的对象实例。

      mongoengine 代码中def create() 中的代码部分: Reff: Monogoengine code 清楚地表明create() 函数调用了save() 函数:

      从 mongoengine 代码中提取:

      def create(self, **kwargs):
              """Create new object. Returns the saved object instance.
              .. versionadded:: 0.4
              """
              return self._document(**kwargs).save()
      

      因此我的try 块必须包含create() 方法,如下所示:

       try:
                  employee = models.Employee.objects.create(
                      email="pedro.kong@company.com",
                      first_name="Pedro",
                      last_name="Kong"
                  )
                  employee.save()
              except Exception as e:
                  return "Error \n %s" % (e)
              return "Business Tested"
      

      【讨论】:

        猜你喜欢
        • 2014-12-24
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 2021-09-17
        • 2021-10-03
        相关资源
        最近更新 更多