From 04edb528ca39d25a019e7b391a3b5a69156848fe Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 18 Mar 2008 02:49:46 +0000 Subject: - Issue #2371: Add a Py3k warning when catching an exception that doesn't derive from BaseException. --- Misc/ACKS | 1 + Misc/NEWS | 3 +++ Python/ceval.c | 27 +++++++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/Misc/ACKS b/Misc/ACKS index cce6152..86ff1ea 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -360,6 +360,7 @@ Magnus Kessler Lawrence Kesteloot Vivek Khera Mads Kiilerich +Taek Joo Kim Steve Kirsch Ron Klatchko Bastian Kleineidam diff --git a/Misc/NEWS b/Misc/NEWS index 03597a5..cb84491 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 2? Core and builtins ----------------- +- Issue #2371: Add a Py3k warning when catching an exception that + doesn't derive from BaseException. + - Issue #2321: use pymalloc for unicode object string data to reduce memory usage in some circumstances. diff --git a/Python/ceval.c b/Python/ceval.c index 4fc1709..72da263 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4042,6 +4042,13 @@ assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) } } +#define Py3kExceptionClass_Check(x) \ + (PyType_Check((x)) && \ + PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS)) + +#define CANNOT_CATCH_MSG "catching classes that don't inherit from " \ + "BaseException is not allowed in 3.x." + static PyObject * cmp_outcome(int op, register PyObject *v, register PyObject *w) { @@ -4079,6 +4086,16 @@ cmp_outcome(int op, register PyObject *v, register PyObject *w) if (ret_val == -1) return NULL; } + if (Py_Py3kWarningFlag && + !Py3kExceptionClass_Check(exc)) + { + int ret_val; + ret_val = PyErr_WarnEx( + PyExc_DeprecationWarning, + CANNOT_CATCH_MSG, 1); + if (ret_val == -1) + return NULL; + } } } else { @@ -4091,6 +4108,16 @@ cmp_outcome(int op, register PyObject *v, register PyObject *w) if (ret_val == -1) return NULL; } + if (Py_Py3kWarningFlag && + !Py3kExceptionClass_Check(w)) + { + int ret_val; + ret_val = PyErr_WarnEx( + PyExc_DeprecationWarning, + CANNOT_CATCH_MSG, 1); + if (ret_val == -1) + return NULL; + } } res = PyErr_GivenExceptionMatches(v, w); break; -- cgit v0.12