catch nasty exception classes with __new__ that doesn't return a exception (closes #11627)
Patch from Andreas Stührk.
This commit is contained in:
parent
1f0ccfa853
commit
5afa03a72e
|
@ -121,6 +121,15 @@ class TestRaise(unittest.TestCase):
|
|||
else:
|
||||
self.fail("No exception raised")
|
||||
|
||||
def test_new_returns_invalid_instance(self):
|
||||
# See issue #11627.
|
||||
class MyException(Exception):
|
||||
def __new__(cls, *args):
|
||||
return object()
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
raise MyException
|
||||
|
||||
|
||||
class TestCause(unittest.TestCase):
|
||||
def test_invalid_cause(self):
|
||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.2.2?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #11627: Fix segfault when __new__ on a exception returns a non-exception
|
||||
class.
|
||||
|
||||
- Issue #12149: Update the method cache after a type's dictionnary gets
|
||||
cleared by the garbage collector. This fixes a segfault when an instance
|
||||
and its type get caught in a reference cycle, and the instance's
|
||||
|
|
|
@ -3413,6 +3413,13 @@ do_raise(PyObject *exc, PyObject *cause)
|
|||
value = PyObject_CallObject(exc, NULL);
|
||||
if (value == NULL)
|
||||
goto raise_error;
|
||||
if (!PyExceptionInstance_Check(value)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"calling %R should have returned an instance of "
|
||||
"BaseException, not %R",
|
||||
type, Py_TYPE(value));
|
||||
goto raise_error;
|
||||
}
|
||||
}
|
||||
else if (PyExceptionInstance_Check(exc)) {
|
||||
value = exc;
|
||||
|
|
Loading…
Reference in New Issue