diff options
author | Brett Cannon <bcannon@gmail.com> | 2007-02-26 22:01:14 (GMT) |
---|---|---|
committer | Brett Cannon <bcannon@gmail.com> | 2007-02-26 22:01:14 (GMT) |
commit | 39590469030b05f976bc1265f1598bd469c14449 (patch) | |
tree | def4a15c94ab7fcb826e60f328066e5a924ea886 | |
parent | 81fe3415083b4736b848519294270801ab53d59a (diff) | |
download | cpython-39590469030b05f976bc1265f1598bd469c14449.zip cpython-39590469030b05f976bc1265f1598bd469c14449.tar.gz cpython-39590469030b05f976bc1265f1598bd469c14449.tar.bz2 |
Make it so TypeError is raised if an instance of an object is put in an
'except' clause. Also refactor some code to help keep Neal Norwitz happy.
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Python/ceval.c | 27 |
2 files changed, 9 insertions, 20 deletions
@@ -32,7 +32,7 @@ Core and Builtins functionality formerly known as raw_input(); the name raw_input() is no longer defined. -- Objects listed in an 'except' clause must inherit from BaseException. +- Classes listed in an 'except' clause must inherit from BaseException. - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone; and .keys(), .items(), .values() return dict views. diff --git a/Python/ceval.c b/Python/ceval.c index fe5de03..5cad632 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3895,23 +3895,8 @@ assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) } } -/* - Return a true value if the exception is allowed to be in an 'except' clause, - otherwise return a false value. -*/ -static int -can_catch_exc(PyObject *exc) -{ - if (!(PyExceptionClass_Check(exc) || PyExceptionInstance_Check(exc))) { - PyErr_SetString(PyExc_TypeError, - "catching an object must be a class or " - "instance of BaseException"); - return 0; - } - else { - return 1; - } -} +#define CANNOT_CATCH_MSG "catching classes that do not inherit from"\ + "BaseException is not allowed" static PyObject * cmp_outcome(int op, register PyObject *v, register PyObject *w) @@ -3941,13 +3926,17 @@ cmp_outcome(int op, register PyObject *v, register PyObject *w) length = PyTuple_Size(w); for (i = 0; i < length; i += 1) { PyObject *exc = PyTuple_GET_ITEM(w, i); - if (!can_catch_exc(exc)) { + if (!PyExceptionClass_Check(exc)) { + PyErr_SetString(PyExc_TypeError, + CANNOT_CATCH_MSG); return NULL; } } } else { - if (!can_catch_exc(w)) { + if (!PyExceptionClass_Check(w)) { + PyErr_SetString(PyExc_TypeError, + CANNOT_CATCH_MSG); return NULL; } } |