def raise2():
raise SystemError
+def exit():
+ raise SystemExit
+
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():
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.
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);