summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-06-12 06:02:13 (GMT)
committerGitHub <noreply@github.com>2017-06-12 06:02:13 (GMT)
commitd89dc844d288ee2e403272f3e4552eed6911cafd (patch)
tree0c69c1ce14194048e402a844113068a857f45e49
parent47c9decb5feabb51416deffd2098ee31d73f1f5f (diff)
downloadcpython-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.py10
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/atexitmodule.c2
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():
diff --git a/Misc/NEWS b/Misc/NEWS
index be2ec4f..e56c5a3 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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);