- Issue #2371: Add a Py3k warning when catching an exception that

doesn't derive from BaseException.
This commit is contained in:
Guido van Rossum 2008-03-18 02:49:46 +00:00
parent 0bb7950829
commit 04edb528ca
3 changed files with 31 additions and 0 deletions

View File

@ -360,6 +360,7 @@ Magnus Kessler
Lawrence Kesteloot Lawrence Kesteloot
Vivek Khera Vivek Khera
Mads Kiilerich Mads Kiilerich
Taek Joo Kim
Steve Kirsch Steve Kirsch
Ron Klatchko Ron Klatchko
Bastian Kleineidam Bastian Kleineidam

View File

@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 2?
Core and builtins 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 - Issue #2321: use pymalloc for unicode object string data to reduce
memory usage in some circumstances. memory usage in some circumstances.

View File

@ -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 * static PyObject *
cmp_outcome(int op, register PyObject *v, register PyObject *w) 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) if (ret_val == -1)
return NULL; 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 { else {
@ -4091,6 +4108,16 @@ cmp_outcome(int op, register PyObject *v, register PyObject *w)
if (ret_val == -1) if (ret_val == -1)
return NULL; 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); res = PyErr_GivenExceptionMatches(v, w);
break; break;