From 8bf7c484c16edfc5084732fdd6d8b64a0f921930 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 26 Jan 1995 00:41:04 +0000 Subject: [PATCH] allow classes as exceptions --- Python/ceval.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index c7fa6972418..fb1c0e7269b 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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; }