diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-06-12 06:02:13 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-12 06:02:13 (GMT) |
commit | d89dc844d288ee2e403272f3e4552eed6911cafd (patch) | |
tree | 0c69c1ce14194048e402a844113068a857f45e49 | |
parent | 47c9decb5feabb51416deffd2098ee31d73f1f5f (diff) | |
download | cpython-d89dc844d288ee2e403272f3e4552eed6911cafd.zip cpython-d89dc844d288ee2e403272f3e4552eed6911cafd.tar.gz cpython-d89dc844d288ee2e403272f3e4552eed6911cafd.tar.bz2 |
[3.6] bpo-28994: Fixed errors handling in atexit._run_exitfuncs(). (GH-2034) (#2121)
The traceback no longer displayed for SystemExit raised in a callback registered by atexit..
(cherry picked from commit 3fd54d4a7e604067e2bc0f8cfd58bdbdc09fa7f4)
-rw-r--r-- | Lib/test/test_atexit.py | 10 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/atexitmodule.c | 2 |
3 files changed, 14 insertions, 1 deletions
diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index c761076..1d0b018 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -23,6 +23,9 @@ def raise1(): def raise2(): raise SystemError +def exit(): + raise SystemExit + class GeneralTest(unittest.TestCase): @@ -76,6 +79,13 @@ class GeneralTest(unittest.TestCase): self.assertRaises(ZeroDivisionError, atexit._run_exitfuncs) self.assertIn("ZeroDivisionError", self.stream.getvalue()) + def test_exit(self): + # be sure a SystemExit is handled properly + atexit.register(exit) + + self.assertRaises(SystemExit, atexit._run_exitfuncs) + self.assertEqual(self.stream.getvalue(), '') + def test_print_tracebacks(self): # Issue #18776: the tracebacks should be printed when errors occur. def f(): @@ -49,6 +49,9 @@ Core and Builtins Library ------- +- bpo-28994: The traceback no longer displayed for SystemExit raised in + a callback registered by atexit. + - bpo-30508: Don't log exceptions if Task/Future "cancel()" method was called. diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 3cdf2d7..35ebf08 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -97,7 +97,7 @@ atexit_callfuncs(void) Py_XDECREF(exc_tb); } PyErr_Fetch(&exc_type, &exc_value, &exc_tb); - if (!PyErr_ExceptionMatches(PyExc_SystemExit)) { + if (!PyErr_GivenExceptionMatches(exc_type, PyExc_SystemExit)) { PySys_WriteStderr("Error in atexit._run_exitfuncs:\n"); PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb); PyErr_Display(exc_type, exc_value, exc_tb); |