summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-10-21 14:13:31 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-10-21 14:13:31 (GMT)
commitd5d32d212719e328f7c22fa6729dd6f9be1ff1c4 (patch)
treee252a71a35aa9b734ca12bd37e5e1aa3c63397a3
parent467ab194fc6189d9f7310c89937c51abeac56839 (diff)
downloadcpython-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.py26
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/typeobject.c7
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 = []
diff --git a/Misc/NEWS b/Misc/NEWS
index 237c928..4410eda 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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);
}