The existing code calls PyObject_GetAttrString which also throws theses exceptions.
The existing code handles these.  I haven't changed anything there.

In common.c there was one place where I HasAttr was called and a PyErr_Clear was added to
handle this.

What this code does is try to avoid raised exceptions where its easy by skipping the call to tp->tp_getattr
for None, tuple, list, and avoiding the exception directly raised in PyObject_GetAttrString.

tp_getattro can still raise exceptions which are handled the old way.