Skip to content

Commit

Permalink
Issue python#29507: Update test_exceptions
Browse files Browse the repository at this point in the history
test_unraisable() of test_exceptions expects that PyErr_WriteUnraisable(method)
fails on repr(method).

Before the previous change (7b8df4a5d81d), slot_tp_finalize() called
PyErr_WriteUnraisable() with a PyMethodObject. In this case, repr(method) calls
repr(self) which is BrokenRepr.__repr__() and the calls raises a new exception.

After the previous change, slot_tp_finalize() uses an unbound method: repr() is
called on a regular __del__() method which doesn't call repr(self). repr()
doesn't fail anymore.

PyErr_WriteUnraisable() doesn't call __repr__() anymore, so remove BrokenRepr
unit test.
  • Loading branch information
vstinner committed Feb 9, 2017
1 parent 516b981 commit 331bbe6
Showing 1 changed file with 2 additions and 9 deletions.
11 changes: 2 additions & 9 deletions Lib/test/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1023,27 +1023,20 @@ def __del__(self):
# The following line is included in the traceback report:
raise exc

class BrokenRepr(BrokenDel):
def __repr__(self):
raise AttributeError("repr() is broken")

class BrokenExceptionDel:
def __del__(self):
exc = BrokenStrException()
# The following line is included in the traceback report:
raise exc

for test_class in (BrokenDel, BrokenRepr, BrokenExceptionDel):
for test_class in (BrokenDel, BrokenExceptionDel):
with self.subTest(test_class):
obj = test_class()
with captured_stderr() as stderr:
del obj
report = stderr.getvalue()
self.assertIn("Exception ignored", report)
if test_class is BrokenRepr:
self.assertIn("<object repr() failed>", report)
else:
self.assertIn(test_class.__del__.__qualname__, report)
self.assertIn(test_class.__del__.__qualname__, report)
self.assertIn("test_exceptions.py", report)
self.assertIn("raise exc", report)
if test_class is BrokenExceptionDel:
Expand Down

0 comments on commit 331bbe6

Please sign in to comment.