- Issue #2371: Add a Py3k warning when catching an exception that
  doesn't derive from BaseException.
diff --git a/Misc/ACKS b/Misc/ACKS
index cce6152..86ff1ea 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -360,6 +360,7 @@
 Lawrence Kesteloot
 Vivek Khera
 Mads Kiilerich
+Taek Joo Kim
 Steve Kirsch
 Ron Klatchko
 Bastian Kleineidam
diff --git a/Misc/NEWS b/Misc/NEWS
index 03597a5..cb84491 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@
 Core and builtins
 -----------------
 
+- Issue #2371: Add a Py3k warning when catching an exception that
+  doesn't derive from BaseException.
+
 - Issue #2321: use pymalloc for unicode object string data to reduce
   memory usage in some circumstances.
 
diff --git a/Python/ceval.c b/Python/ceval.c
index 4fc1709..72da263 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -4042,6 +4042,13 @@
 	}
 }
 
+#define Py3kExceptionClass_Check(x)     \
+    (PyType_Check((x)) &&               \
+     PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))
+
+#define CANNOT_CATCH_MSG "catching classes that don't inherit from " \
+			 "BaseException is not allowed in 3.x."
+
 static PyObject *
 cmp_outcome(int op, register PyObject *v, register PyObject *w)
 {
@@ -4079,6 +4086,16 @@
 					if (ret_val == -1)
 						return NULL;
 				}
+				if (Py_Py3kWarningFlag  &&
+				    !Py3kExceptionClass_Check(exc))
+				{
+					int ret_val;
+					ret_val = PyErr_WarnEx(
+						PyExc_DeprecationWarning,
+						CANNOT_CATCH_MSG, 1);
+					if (ret_val == -1)
+						return NULL;
+				}
 			}
 		}
 		else {
@@ -4091,6 +4108,16 @@
 				if (ret_val == -1)
 					return NULL;
 			}
+			if (Py_Py3kWarningFlag  &&
+			    !Py3kExceptionClass_Check(w))
+			{
+				int ret_val;
+				ret_val = PyErr_WarnEx(
+					PyExc_DeprecationWarning,
+					CANNOT_CATCH_MSG, 1);
+				if (ret_val == -1)
+					return NULL;
+			}
 		}
 		res = PyErr_GivenExceptionMatches(v, w);
 		break;