使用嵌套的Django transaction.atomic()来处理异常?

时间:2017-03-03 19:30:13

标签: python django transactions

Django的文档说明了it('should find a non-name-spaced component as a variable', () => { expect(modal.find(OtherComponent)).toHaveLength(1); // passes }); it('should find a non-name-spaced component as a string', () => { expect(modal.find('OtherComponent')).toHaveLength(1); // passes }); it('should find a name-spaced component as a variable', () => { expect(modal.find(Modal.Heading)).toHaveLength(1); // passes }); it('should (not) find a name-spaced component as a string', () => { expect(modal.find('Modal.Heading')).toHaveLength(1); // fails }); 和例外:

https://docs.djangoproject.com/en/1.10/topics/db/transactions/#django.db.transaction.atomic

  

避免在原子内捕获异常!

     

...

     

捕获数据库错误的正确方法是围绕原子块,如上所示。如有必要,为此目的添加额外的原子块。此模式具有另一个优点:它可以明确地分隔在发生异常时将回滚哪些操作。

     

...

"如果需要,为此目的添加额外的原子块。"看起来像?我可以这样做,或者这会导致"意外行为"?

transaction.atomic()

他们是否意味着这样写?如果是这样,为什么会有所不同?

valid = True
errors = []
objects = MyModel.objects.all()
try:
    with transaction.atomic():
        for obj in objects:
            try:
                # Update and save obj here...
            except:
                errors.append("obj {} had errors".format(obj.pk))
                valid = False
        if not valid:
            raise Exception('batch update failed.')

except Exception as ex:
    # Handle it..

1 个答案:

答案 0 :(得分:1)

Django仅在事务块捕获DatabaseError(或其子类)时触发回滚,因此您不应该在它之前捕获它。如果添加第二个事务块(第二个示例),则会捕获错误,将事务标记为回滚,然后您可以执行任何操作。

我认为你应该很好,你重新提出完全相同的错误,但这只是猜测。