Since properties are supported here, is possible that
instance_getattr2() raises an exception.  Fix all code that made this
assumption.

Backport candidate.
diff --git a/Objects/classobject.c b/Objects/classobject.c
index ff6f11e..f7b442a 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -549,6 +549,10 @@
 		initstr = PyString_InternFromString("__init__");
 	init = instance_getattr2(inst, initstr);
 	if (init == NULL) {
+		if (PyErr_Occurred()) {
+			Py_DECREF(inst);
+			return NULL;
+		}
 		if ((arg != NULL && (!PyTuple_Check(arg) ||
 				     PyTuple_Size(arg) != 0))
 		    || (kw != NULL && (!PyDict_Check(kw) ||
@@ -694,7 +698,7 @@
 		}
 	}
 	v = instance_getattr2(inst, name);
-	if (v == NULL) {
+	if (v == NULL && !PyErr_Occurred()) {
 		PyErr_Format(PyExc_AttributeError,
 			     "%.50s instance has no attribute '%.400s'",
 			     PyString_AS_STRING(inst->in_class->cl_name), sname);
@@ -1809,25 +1813,20 @@
 	/* If the instance doesn't define an __getattr__ method, use
 	   instance_getattr2 directly because it will not set an
 	   exception on failure. */
-	if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL) {
+	if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
 		method = instance_getattr2((PyInstanceObject *)v,
 					   name_op[op]);
-		if (method == NULL) {
-			assert(!PyErr_Occurred());
-			res = Py_NotImplemented;
-			Py_INCREF(res);
-			return res;
-		}
-	} else {
+	else
 		method = PyObject_GetAttr(v, name_op[op]);
-		if (method == NULL) {
+	if (method == NULL) {
+		if (PyErr_Occurred()) {
 			if (!PyErr_ExceptionMatches(PyExc_AttributeError))
 				return NULL;
 			PyErr_Clear();
-			res = Py_NotImplemented;
-			Py_INCREF(res);
-			return res;
 		}
+		res = Py_NotImplemented;
+		Py_INCREF(res);
+		return res;
 	}
 
 	args = Py_BuildValue("(O)", w);