#25761: Re-raised exceptions with __cause__ should also set __traceback__ on the
exception
----------------------------------------------+--------------------
     Reporter:  rhertzog                      |      Owner:  nobody
         Type:  Bug                           |     Status:  new
    Component:  Database layer (models, ORM)  |    Version:  1.8
     Severity:  Release blocker               |   Keywords:
 Triage Stage:  Unreviewed                    |  Has patch:  0
Easy pickings:  0                             |      UI/UX:  0
----------------------------------------------+--------------------
 In bug https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=802677 we have a
 report that testtools is broken when handling database exceptions raised
 by Django. This has been brought to the upstream developers of testtools
 who were quick to point out that Django is at fault:
 https://github.com/testing-
 cabal/testtools/issues/162#issuecomment-156891988

 Django is setting the {{{__cause__}}} attribute thus mimicking Python's 3
 behaviour, but not ensuring that the associated exception has a usable
 {{{__traceback__}}} attribute. The traceback2 module (backport of Python
 3's traceback) relies on this... thus Django should also make sure that
 the exception has the expected attribute when it sets {{{__cause__}}}.

 This needs to be fixed at least in django/db/utils.py
 ({{{DatabaseErrorWrapper.__exit__()}}}). But there are other cases where
 Django is setting {{{__cause___}}} in django/db/migrations/loader.py,
 django/utils/dictconfig.py and django/utils/timezone.py. It looks like
 they might have the same problem.

 A fix for the first case might possibly be something like this (untested):
 {{{
 --- a/django/db/utils.py
 +++ b/django/db/utils.py
 @@ -91,6 +91,8 @@ class DatabaseErrorWrapper(object):
              if issubclass(exc_type, db_exc_type):
                  dj_exc_value = dj_exc_type(*exc_value.args)
                  dj_exc_value.__cause__ = exc_value
 +                if not hasattr(exc_value, '__traceback__'):
 +                    setattr(exc_value, '__traceback__', traceback)
                  # Only set the 'errors_occurred' flag for errors that may
 make
                  # the connection unusable.
                  if dj_exc_type not in (DataError, IntegrityError):
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/25761>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.8cf937721f9ab1876e369b4f0b4b145e%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to