diff --git a/django/utils/autoreload.py b/django/utils/autoreload.py index a07fb04abf1..61804ee7fe4 100644 --- a/django/utils/autoreload.py +++ b/django/utils/autoreload.py @@ -227,8 +227,7 @@ def check_errors(fn): global _exception try: fn(*args, **kwargs) - except (ImportError, IndentationError, NameError, SyntaxError, - TypeError, AttributeError): + except Exception: _exception = sys.exc_info() et, ev, tb = _exception diff --git a/tests/utils_tests/test_autoreload.py b/tests/utils_tests/test_autoreload.py index 181ee02b964..30010f29456 100644 --- a/tests/utils_tests/test_autoreload.py +++ b/tests/utils_tests/test_autoreload.py @@ -169,3 +169,19 @@ class TestFilenameGenerator(TestCase): with self.assertRaises(SyntaxError): autoreload.check_errors(import_module)('test_syntax_error') self.assertFileFoundOnlyNew(filename) + + def test_check_errors_catches_all_exceptions(self): + """ + Since Python may raise arbitrary exceptions when importing code, + check_errors() must catch Exception, not just some subclasses. + """ + dirname = tempfile.mkdtemp() + filename = os.path.join(dirname, 'test_exception.py') + self.addCleanup(shutil.rmtree, dirname) + with open(filename, 'w') as f: + f.write("raise Exception") + + with extend_sys_path(dirname): + with self.assertRaises(Exception): + autoreload.check_errors(import_module)('test_exception') + self.assertFileFound(filename)