Skip to content

Commit

Permalink
[2.2.x] Fixed #30516 -- Fixed crash of autoreloader when re-raising e…
Browse files Browse the repository at this point in the history
…xceptions with custom signature.

Regression in c8720e7.

Backport of 0344565 from master
  • Loading branch information
orf authored and felixxm committed May 29, 2019
1 parent 0f0d1cd commit ace0bec
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
2 changes: 1 addition & 1 deletion django/utils/autoreload.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def wrapper(*args, **kwargs):
def raise_last_exception():
global _exception
if _exception is not None:
raise _exception[0](_exception[1]).with_traceback(_exception[2])
raise _exception[1]


def ensure_echo_on():
Expand Down
3 changes: 3 additions & 0 deletions docs/releases/2.2.2.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@ Bugfixes
* Fixed crash of :class:`~django.contrib.postgres.aggregates.ArrayAgg` and
:class:`~django.contrib.postgres.aggregates.StringAgg` with ``ordering``
argument when used in a ``Subquery`` (:ticket:`30315`).

* Fixed a regression in Django 2.2 that caused a crash of auto-reloader when
an exception with custom signature is raised (:ticket:`30516`).
30 changes: 30 additions & 0 deletions tests/utils_tests/test_autoreload.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,36 @@ class MyException(Exception):
with self.assertRaisesMessage(MyException, 'Test Message'):
autoreload.raise_last_exception()

def test_raises_custom_exception(self):
class MyException(Exception):
def __init__(self, msg, extra_context):
super().__init__(msg)
self.extra_context = extra_context
# Create an exception.
try:
raise MyException('Test Message', 'extra context')
except MyException:
exc_info = sys.exc_info()

with mock.patch('django.utils.autoreload._exception', exc_info):
with self.assertRaisesMessage(MyException, 'Test Message'):
autoreload.raise_last_exception()

def test_raises_exception_with_context(self):
try:
raise Exception(2)
except Exception as e:
try:
raise Exception(1) from e
except Exception:
exc_info = sys.exc_info()

with mock.patch('django.utils.autoreload._exception', exc_info):
with self.assertRaises(Exception) as cm:
autoreload.raise_last_exception()
self.assertEqual(cm.exception.args[0], 1)
self.assertEqual(cm.exception.__cause__.args[0], 2)


class RestartWithReloaderTests(SimpleTestCase):
executable = '/usr/bin/python'
Expand Down

0 comments on commit ace0bec

Please sign in to comment.