summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/utils/autoreload.py2
-rw-r--r--docs/releases/2.2.2.txt3
-rw-r--r--tests/utils_tests/test_autoreload.py30
3 files changed, 34 insertions, 1 deletions
diff --git a/django/utils/autoreload.py b/django/utils/autoreload.py
index cb7cd1c725..a339c061f0 100644
--- a/django/utils/autoreload.py
+++ b/django/utils/autoreload.py
@@ -74,7 +74,7 @@ def check_errors(fn):
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():
diff --git a/docs/releases/2.2.2.txt b/docs/releases/2.2.2.txt
index 08af175caa..e95fa343fc 100644
--- a/docs/releases/2.2.2.txt
+++ b/docs/releases/2.2.2.txt
@@ -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`).
diff --git a/tests/utils_tests/test_autoreload.py b/tests/utils_tests/test_autoreload.py
index e7305f6ac9..520c5583a4 100644
--- a/tests/utils_tests/test_autoreload.py
+++ b/tests/utils_tests/test_autoreload.py
@@ -295,6 +295,36 @@ class TestRaiseLastException(SimpleTestCase):
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'