bpo-35459: Use PyDict_GetItemWithError() instead of PyDict_GetItem(). (GH-11112)

diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c
index 5586989..190f993 100644
--- a/Modules/xxlimited.c
+++ b/Modules/xxlimited.c
@@ -78,11 +78,14 @@
 Xxo_getattro(XxoObject *self, PyObject *name)
 {
     if (self->x_attr != NULL) {
-        PyObject *v = PyDict_GetItem(self->x_attr, name);
+        PyObject *v = PyDict_GetItemWithError(self->x_attr, name);
         if (v != NULL) {
             Py_INCREF(v);
             return v;
         }
+        else if (PyErr_Occurred()) {
+            return NULL;
+        }
     }
     return PyObject_GenericGetAttr((PyObject *)self, name);
 }
@@ -97,7 +100,7 @@
     }
     if (v == NULL) {
         int rv = PyDict_DelItemString(self->x_attr, name);
-        if (rv < 0)
+        if (rv < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
             PyErr_SetString(PyExc_AttributeError,
                 "delete non-existing Xxo attribute");
         return rv;