#2196 hasattr now allows SystemExit and KeyboardInterrupt to propagate
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index 1e559eb..15d80a3 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -590,6 +590,16 @@
         if have_unicode:
             self.assertRaises(UnicodeError, hasattr, sys, unichr(sys.maxunicode))
 
+        # Check that hasattr allows SystemExit and KeyboardInterrupts by
+        class A:
+            def __getattr__(self, what):
+                raise KeyboardInterrupt
+        self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
+        class B:
+            def __getattr__(self, what):
+                raise SystemExit
+        self.assertRaises(SystemExit, hasattr, B(), "b")
+
     def test_hash(self):
         hash(None)
         self.assertEqual(hash(1), hash(1L))
diff --git a/Misc/NEWS b/Misc/NEWS
index 252dbe3..7384c9d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -17,6 +17,9 @@
 
 - Issue #2790: sys.flags was not properly exposing its bytes_warning attribute.
 
+- Issue #2196: hasattr now lets exceptions which do not inherit Exception
+  (KeyboardInterrupt, and SystemExit) propagate instead of ignoring them
+
 Extension Modules
 -----------------
 
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 02a2faa..0234b6b 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -877,9 +877,13 @@
 	}
 	v = PyObject_GetAttr(v, name);
 	if (v == NULL) {
-		PyErr_Clear();
-		Py_INCREF(Py_False);
-		return Py_False;
+		if (!PyErr_ExceptionMatches(PyExc_Exception))
+			return NULL;
+		else {
+			PyErr_Clear();
+			Py_INCREF(Py_False);
+			return Py_False;
+		}
 	}
 	Py_DECREF(v);
 	Py_INCREF(Py_True);