mirror of
https://github.com/python/cpython.git
synced 2025-10-08 16:11:51 +00:00
[3.6] bpo-28603: Fix formatting tracebacks for unhashable exceptions (GH-4014) (#4024)
(cherry picked from commit de86073a76
)
This commit is contained in:
parent
858ea4354f
commit
2712247ec9
9 changed files with 114 additions and 9 deletions
|
@ -443,6 +443,33 @@ class TracebackFormatTests(unittest.TestCase):
|
|||
' return traceback.format_stack()\n' % (__file__, lineno+1),
|
||||
])
|
||||
|
||||
@cpython_only
|
||||
def test_unhashable(self):
|
||||
from _testcapi import exception_print
|
||||
|
||||
class UnhashableException(Exception):
|
||||
def __eq__(self, other):
|
||||
return True
|
||||
|
||||
ex1 = UnhashableException('ex1')
|
||||
ex2 = UnhashableException('ex2')
|
||||
try:
|
||||
raise ex2 from ex1
|
||||
except UnhashableException:
|
||||
try:
|
||||
raise ex1
|
||||
except UnhashableException:
|
||||
exc_type, exc_val, exc_tb = sys.exc_info()
|
||||
|
||||
with captured_output("stderr") as stderr_f:
|
||||
exception_print(exc_val)
|
||||
|
||||
tb = stderr_f.getvalue().strip().splitlines()
|
||||
self.assertEqual(11, len(tb))
|
||||
self.assertEqual(context_message.strip(), tb[5])
|
||||
self.assertIn('UnhashableException: ex2', tb[3])
|
||||
self.assertIn('UnhashableException: ex1', tb[10])
|
||||
|
||||
|
||||
cause_message = (
|
||||
"\nThe above exception was the direct cause "
|
||||
|
@ -994,6 +1021,25 @@ class TestTracebackException(unittest.TestCase):
|
|||
self.assertEqual(exc_info[0], exc.exc_type)
|
||||
self.assertEqual(str(exc_info[1]), str(exc))
|
||||
|
||||
def test_unhashable(self):
|
||||
class UnhashableException(Exception):
|
||||
def __eq__(self, other):
|
||||
return True
|
||||
|
||||
ex1 = UnhashableException('ex1')
|
||||
ex2 = UnhashableException('ex2')
|
||||
try:
|
||||
raise ex2 from ex1
|
||||
except UnhashableException:
|
||||
try:
|
||||
raise ex1
|
||||
except UnhashableException:
|
||||
exc_info = sys.exc_info()
|
||||
exc = traceback.TracebackException(*exc_info)
|
||||
formatted = list(exc.format())
|
||||
self.assertIn('UnhashableException: ex2\n', formatted[2])
|
||||
self.assertIn('UnhashableException: ex1\n', formatted[6])
|
||||
|
||||
def test_limit(self):
|
||||
def recurse(n):
|
||||
if n:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue