As far as I am concerned, the implementation of PyObject_Unicode in
object.c has a bug in it: it should NEVER be retrieving __unicode__ from
the instance object. The implementation of PyObject_Format in abstract.c
shows the correct way to retrieve a pseudo-slot method like __unicode__
from an arbitrary object.
Line 482 in object.c is the offending line:
func = PyObject_GetAttr(v, unicodestr);
Fix that bug, then add a __unicode__ method back to Exception objects
and you will have the best of both worlds.