diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-21 14:13:31 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-21 14:13:31 (GMT) |
commit | d5d32d212719e328f7c22fa6729dd6f9be1ff1c4 (patch) | |
tree | e252a71a35aa9b734ca12bd37e5e1aa3c63397a3 | |
parent | 467ab194fc6189d9f7310c89937c51abeac56839 (diff) | |
download | cpython-d5d32d212719e328f7c22fa6729dd6f9be1ff1c4.zip cpython-d5d32d212719e328f7c22fa6729dd6f9be1ff1c4.tar.gz cpython-d5d32d212719e328f7c22fa6729dd6f9be1ff1c4.tar.bz2 |
Issue #28214: Improved exception reporting for problematic __set_name__
attributes.
-rw-r--r-- | Lib/test/test_subclassinit.py | 26 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Objects/typeobject.c | 7 |
3 files changed, 28 insertions, 8 deletions
diff --git a/Lib/test/test_subclassinit.py b/Lib/test/test_subclassinit.py index 0267e41..6a12fb1 100644 --- a/Lib/test/test_subclassinit.py +++ b/Lib/test/test_subclassinit.py @@ -133,20 +133,32 @@ class Test(unittest.TestCase): def test_set_name_error(self): class Descriptor: def __set_name__(self, owner, name): - raise RuntimeError + 1/0 - with self.assertRaises(RuntimeError): - class A: - d = Descriptor() + with self.assertRaises(RuntimeError) as cm: + class NotGoingToWork: + attr = Descriptor() + + exc = cm.exception + self.assertRegex(str(exc), r'\bNotGoingToWork\b') + self.assertRegex(str(exc), r'\battr\b') + self.assertRegex(str(exc), r'\bDescriptor\b') + self.assertIsInstance(exc.__cause__, ZeroDivisionError) def test_set_name_wrong(self): class Descriptor: def __set_name__(self): pass - with self.assertRaises(TypeError): - class A: - d = Descriptor() + with self.assertRaises(RuntimeError) as cm: + class NotGoingToWork: + attr = Descriptor() + + exc = cm.exception + self.assertRegex(str(exc), r'\bNotGoingToWork\b') + self.assertRegex(str(exc), r'\battr\b') + self.assertRegex(str(exc), r'\bDescriptor\b') + self.assertIsInstance(exc.__cause__, TypeError) def test_set_name_lookup(self): resolved = [] @@ -10,6 +10,9 @@ What's New in Python 3.6.0 beta 3 Core and Builtins ----------------- +- Issue #28214: Improved exception reporting for problematic __set_name__ + attributes. + - Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception loss in PyTraceBack_Here(). diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 1021a75..bfbeb40 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -7022,8 +7022,13 @@ set_names(PyTypeObject *type) if (set_name != NULL) { tmp = PyObject_CallFunctionObjArgs(set_name, type, key, NULL); Py_DECREF(set_name); - if (tmp == NULL) + if (tmp == NULL) { + _PyErr_FormatFromCause(PyExc_RuntimeError, + "Error calling __set_name__ on '%.100s' instance %R " + "in '%.100s'", + value->ob_type->tp_name, key, type->tp_name); return -1; + } else Py_DECREF(tmp); } |