]> granicus.if.org Git - python/commitdiff
Issue #29507: Update test_exceptions
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 9 Feb 2017 22:49:50 +0000 (23:49 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 9 Feb 2017 22:49:50 +0000 (23:49 +0100)
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.

Lib/test/test_exceptions.py

index 34265a517f2caf86d6f30d0eb9e2a3f219b3707b..14e0f840d45cdd0634dfd9c28cf55846071494ed 100644 (file)
@@ -1023,27 +1023,20 @@ class ExceptionTests(unittest.TestCase):
                 # 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: