[2.7] bpo-28994: Fixed errors handling in atexit._run_exitfuncs(). (GH-2034) (#2123)

The traceback no longer displayed for SystemExit raised in a callback registered by atexit..
(cherry picked from commit 3fd54d4a7e604067e2bc0f8cfd58bdbdc09fa7f4)
diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py
index bf85b75..bde8987 100644
--- a/Lib/test/test_atexit.py
+++ b/Lib/test/test_atexit.py
@@ -5,12 +5,17 @@
 from imp import reload
 from test import test_support
 
+
+def exit():
+    raise SystemExit
+
+
 class TestCase(unittest.TestCase):
     def setUp(self):
-        s = StringIO.StringIO()
         self.save_stdout = sys.stdout
         self.save_stderr = sys.stderr
-        sys.stdout = sys.stderr = self.subst_io = s
+        self.stream = StringIO.StringIO()
+        sys.stdout = sys.stderr = self.subst_io = self.stream
         self.save_handlers = atexit._exithandlers
         atexit._exithandlers = []
 
@@ -55,6 +60,13 @@
         atexit.register(self.raise2)
         self.assertRaises(TypeError, atexit._run_exitfuncs)
 
+    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(), '')
+
     ### helpers
     def h1(self):
         print "h1"