]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
allow classes as exceptions
authorGuido van Rossum <guido@python.org>
Thu, 26 Jan 1995 00:41:04 +0000 (00:41 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 26 Jan 1995 00:41:04 +0000 (00:41 +0000)
Python/ceval.c

index c7fa69724186b5f482896df043e2f73b3de54d49..fb1c0e7269ba34300b16a1ce5632c66d6abf0508 100644 (file)
@@ -783,13 +783,33 @@ eval_code(co, globals, locals, owner, arg)
                                u = w;
                                w = gettupleitem(u, 0);
                                INCREF(w);
+                               INCREF(w);
                                DECREF(u);
                        }
-                       if (!is_stringobject(w))
-                               err_setstr(TypeError,
-                                       "exceptions must be strings");
-                       else
+                       if (is_stringobject(w)) {
                                err_setval(w, v);
+                       } else if (is_classobject(w)) {
+                               if (!is_instanceobject(v)
+                                   || !issubclass((object*)((instanceobject*)v)->in_class,
+                                                  w))
+                                       err_setstr(TypeError,
+                                                  "a class exception must have a value that is an instance of the class");
+                               else
+                                       err_setval(w,v);
+                       } else if (is_instanceobject(w)) {
+                               if (v != None)
+                                       err_setstr(TypeError,
+                                                  "an instance exception may not have a separate value");
+                               else {
+                                       DECREF(v);
+                                       v = w;
+                                       w = (object*) ((instanceobject*)w)->in_class;
+                                       INCREF(w);
+                                       err_setval(w, v);
+                               }
+                       } else
+                               err_setstr(TypeError,
+                                       "exceptions must be strings, classes, or instances");
                        DECREF(v);
                        DECREF(w);
                        why = WHY_EXCEPTION;
@@ -2393,6 +2413,8 @@ cmp_exception(err, v)
                }
                return 0;
        }
+       if (is_classobject(v) && is_classobject(err))
+               return issubclass(err, v);
        return err == v;
 }