Mercurial > cpython-lru_cache-weakref
diff Python/ceval.c @ 40942:4b9d0dac79cc
You can no longer catch non-BaseException objects; TypeError is raised if such
an object is listed in an 'except' clause.
| author | Brett Cannon <bcannon@gmail.com> |
|---|---|
| date | Mon, 26 Feb 2007 21:10:16 +0000 |
| parents | 6aa1be5dd009 |
| children | c79e6234fb19 |
line wrap: on
line diff
--- a/Python/ceval.c Mon Feb 26 19:14:12 2007 +0000 +++ b/Python/ceval.c Mon Feb 26 21:10:16 2007 +0000 @@ -1571,7 +1571,7 @@ why == WHY_CONTINUE) retval = POP(); } - else if (PyExceptionClass_Check(v) || PyString_Check(v)) { + else if (PyExceptionClass_Check(v)) { w = POP(); u = POP(); PyErr_Restore(v, w, u); @@ -3916,6 +3916,24 @@ } } +/* + 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; + } +} + static PyObject * cmp_outcome(int op, register PyObject *v, register PyObject *w) { @@ -3944,28 +3962,14 @@ length = PyTuple_Size(w); for (i = 0; i < length; i += 1) { PyObject *exc = PyTuple_GET_ITEM(w, i); - if (PyString_Check(exc)) { - int ret_val; - ret_val = PyErr_WarnEx( - PyExc_DeprecationWarning, - "catching of string " - "exceptions is " - "deprecated", 1); - if (ret_val == -1) - return NULL; + if (!can_catch_exc(exc)) { + return NULL; } } } else { - if (PyString_Check(w)) { - int ret_val; - ret_val = PyErr_WarnEx( - PyExc_DeprecationWarning, - "catching of string " - "exceptions is deprecated", - 1); - if (ret_val == -1) - return NULL; + if (!can_catch_exc(w)) { + return NULL; } } res = PyErr_GivenExceptionMatches(v, w);
