diff options
author | Tom Forbes <tom@tomforb.es> | 2019-05-28 19:06:39 +0100 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-05-29 08:08:50 +0200 |
commit | 0344565179527d80990e2247e3be7c04aa8c43c8 (patch) | |
tree | e5a85abdbe27ca9c3ad849ba0e06736c863f31a3 | |
parent | fcbc502af93f0ee75522c45ae6ec2925da9f2145 (diff) | |
download | django-0344565179527d80990e2247e3be7c04aa8c43c8.tar.gz |
Fixed #30516 -- Fixed crash of autoreloader when re-raising exceptions with custom signature.
Regression in c8720e7696ca41f3262d5369365cc1bd72a216ca.
-rw-r--r-- | django/utils/autoreload.py | 2 | ||||
-rw-r--r-- | docs/releases/2.2.2.txt | 3 | ||||
-rw-r--r-- | tests/utils_tests/test_autoreload.py | 30 |
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' |