【问题标题】:failed to catch duplicate error未能捕获重复错误
【发布时间】:2018-08-02 01:01:07
【问题描述】:
from pymongo.errors import DuplicateKeyError

def insert_duplicate_token(self):
        try:                       
            fields = ..
            token = Token.create_a_new_document(fields)
            token.save()
            token = Token.create_a_new_document(fields)
            token.save()

            self.logger.info('success')

        except DuplicateKeyError:
            self.logger.exception('Duplicate caught')

        except Exception, err:
            self.logger.exception('failed...')
            return False

引发的错误是 u'试图保存重复的唯一键(E11000重复键错误集合:oauth_test.tokens索引:idx_access_token dup key:{:“gRULKp6sqPWRYDrJNrvaifMhlaC8qvzfZOpqTZLTPxHnQ691vT”})'

但在Exception 中被捕获,而不是在DuplicateKeyError

试过了

import pymongo
pymongo.errors - does not exists

这里是stacktrace

Traceback (most recent call last):
  File "move_invalid_tokens_worker.py", line 91, in insert_duplicate_token
    token.save()
  File "/Users/ohadperry/.virtualenvs/oauth/lib/python2.7/site-packages/mongoengine/document.py", line 386, in save
    raise NotUniqueError(message % unicode(err))
NotUniqueError: Tried to save duplicate unique keys (E11000 duplicate key error collection: oauth_test.tokens index: access_token_1 dup key: { : "MIeJey0f3rWkedMZacDIjDMB3a04ilrbdieKaZ2BWt0lI0sATP" })

奇怪..

【问题讨论】:

  • 你能提供完整的追溯吗?
  • 添加到问题正文中

标签: mongodb python-2.7 pymongo


【解决方案1】:

我用 stackstrace 回答了自己,谢谢@Arount

from pymongo.errors import DuplicateKeyError
from mongoengine import NotUniqueError 

def insert_duplicate_token(self):
        try:                       
            fields = ..
            token = Token.create_a_new_document(fields)
            token.save()
            token = Token.create_a_new_document(fields)
            token.save()

            self.logger.info('success')

        except (NotUniqueError, DuplicateKeyError), error:
            self.logger.exception('Duplicate caught')

        except Exception, error:
            self.logger.exception('failed...')
            return False

【讨论】:

  • 既然我在这里,对于未来的用户来说,看起来DuplicateKeyError 引用_id 字段(“主键”已经存在),而NotUniqueError 引用唯一索引规则。这就是为什么存在 2 个不同的异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2023-03-04
  • 1970-01-01
  • 2015-07-11
  • 2021-07-08
  • 2020-12-11
  • 1970-01-01
相关资源
最近更新 更多