]> granicus.if.org Git - python/commitdiff
SF bug #1014215: Unspecific errors with metaclass
authorRaymond Hettinger <python@rcn.com>
Thu, 16 Sep 2004 16:41:57 +0000 (16:41 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 16 Sep 2004 16:41:57 +0000 (16:41 +0000)
High level error message was stomping useful detailed messages from lower
level routines.

The new approach is to augment string error messages returned by the low
level routines.  The provides both high and low level information.  If
the exception value is not a string, no changes are made.

To see the improved messages in action, type:
   import random
   class R(random): pass
   class B(bool): pass

Python/ceval.c

index 186bc82122dab5f5222d7d1895bbbad3d11ea3b0..2223aba735638a5c09e9dea9e7c194cf9a6be48a 100644 (file)
@@ -4086,10 +4086,22 @@ build_class(PyObject *methods, PyObject *bases, PyObject *name)
                /* A type error here likely means that the user passed 
                   in a base that was not a class (such the random module
                   instead of the random.random type).  Help them out with
-                  a more informative error message */
-               PyErr_SetString(PyExc_TypeError,
-                       "Error when calling the metaclass.\n" \
-                       "Make sure the base arguments are valid.");
+                  by augmenting the error message with more information.*/
+
+               PyObject *ptype, *pvalue, *ptraceback;
+
+               PyErr_Fetch(&ptype, &pvalue, &ptraceback);
+               if (PyString_Check(pvalue)) {
+                       PyObject *newmsg;
+                       newmsg = PyString_FromFormat(
+                               "Error when calling the metaclass bases\n    %s",
+                               PyString_AS_STRING(pvalue));
+                       if (newmsg != NULL) {
+                               Py_DECREF(pvalue);
+                               pvalue = newmsg;
+                       }
+               }
+               PyErr_Restore(ptype, pvalue, ptraceback);
        }
        return result;
 }