gh-128894: Fix TracebackException._format_syntax_error
on custom SyntaxError
metadata (#128946)
This commit is contained in:
parent
a9f5edbf5f
commit
a16ded10ad
@ -376,6 +376,30 @@ class TracebackCases(unittest.TestCase):
|
|||||||
' ValueError: 0\n',
|
' ValueError: 0\n',
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_format_exception_group_syntax_error_with_custom_values(self):
|
||||||
|
# See https://github.com/python/cpython/issues/128894
|
||||||
|
for exc in [
|
||||||
|
SyntaxError('error', 'abcd'),
|
||||||
|
SyntaxError('error', [None] * 4),
|
||||||
|
SyntaxError('error', (1, 2, 3, 4)),
|
||||||
|
SyntaxError('error', (1, 2, 3, 4)),
|
||||||
|
SyntaxError('error', (1, 'a', 'b', 2)),
|
||||||
|
# with end_lineno and end_offset:
|
||||||
|
SyntaxError('error', 'abcdef'),
|
||||||
|
SyntaxError('error', [None] * 6),
|
||||||
|
SyntaxError('error', (1, 2, 3, 4, 5, 6)),
|
||||||
|
SyntaxError('error', (1, 'a', 'b', 2, 'c', 'd')),
|
||||||
|
]:
|
||||||
|
with self.subTest(exc=exc):
|
||||||
|
err = traceback.format_exception_only(exc, show_group=True)
|
||||||
|
# Should not raise an exception:
|
||||||
|
if exc.lineno is not None:
|
||||||
|
self.assertEqual(len(err), 2)
|
||||||
|
self.assertTrue(err[0].startswith(' File'))
|
||||||
|
else:
|
||||||
|
self.assertEqual(len(err), 1)
|
||||||
|
self.assertEqual(err[-1], 'SyntaxError: error\n')
|
||||||
|
|
||||||
@requires_subprocess()
|
@requires_subprocess()
|
||||||
@force_not_colorized
|
@force_not_colorized
|
||||||
def test_encoded_file(self):
|
def test_encoded_file(self):
|
||||||
|
@ -1283,7 +1283,7 @@ class TracebackException:
|
|||||||
filename_suffix = ' ({})'.format(self.filename)
|
filename_suffix = ' ({})'.format(self.filename)
|
||||||
|
|
||||||
text = self.text
|
text = self.text
|
||||||
if text is not None:
|
if isinstance(text, str):
|
||||||
# text = " foo\n"
|
# text = " foo\n"
|
||||||
# rtext = " foo"
|
# rtext = " foo"
|
||||||
# ltext = "foo"
|
# ltext = "foo"
|
||||||
@ -1292,10 +1292,17 @@ class TracebackException:
|
|||||||
spaces = len(rtext) - len(ltext)
|
spaces = len(rtext) - len(ltext)
|
||||||
if self.offset is None:
|
if self.offset is None:
|
||||||
yield ' {}\n'.format(ltext)
|
yield ' {}\n'.format(ltext)
|
||||||
else:
|
elif isinstance(self.offset, int):
|
||||||
offset = self.offset
|
offset = self.offset
|
||||||
if self.lineno == self.end_lineno:
|
if self.lineno == self.end_lineno:
|
||||||
end_offset = self.end_offset if self.end_offset not in {None, 0} else offset
|
end_offset = (
|
||||||
|
self.end_offset
|
||||||
|
if (
|
||||||
|
isinstance(self.end_offset, int)
|
||||||
|
and self.end_offset != 0
|
||||||
|
)
|
||||||
|
else offset
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
end_offset = len(rtext) + 1
|
end_offset = len(rtext) + 1
|
||||||
|
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
Fix ``traceback.TracebackException._format_syntax_error`` not to fail on
|
||||||
|
exceptions with custom metadata.
|
Loading…
x
Reference in New Issue
Block a user