[3.8] bpo-34463: Make python tracebacks identical to C tracebacks for
SyntaxErrors without a lineno (GH-23427)
(cherry picked from commit 069560b117
)
Co-authored-by: Irit Katriel <iritkatriel@yahoo.com>
This commit is contained in:
parent
02349e2dc9
commit
b58f6ea0ec
|
@ -679,7 +679,30 @@ class BaseExceptionReportingTests:
|
|||
err = self.get_report(Exception(''))
|
||||
self.assertIn('Exception\n', err)
|
||||
|
||||
def test_syntax_error_no_lineno(self):
|
||||
# See #34463.
|
||||
|
||||
# Without filename
|
||||
e = SyntaxError('bad syntax')
|
||||
msg = self.get_report(e).splitlines()
|
||||
self.assertEqual(msg,
|
||||
['SyntaxError: bad syntax'])
|
||||
e.lineno = 100
|
||||
msg = self.get_report(e).splitlines()
|
||||
self.assertEqual(msg,
|
||||
[' File "<string>", line 100', 'SyntaxError: bad syntax'])
|
||||
|
||||
# With filename
|
||||
e = SyntaxError('bad syntax')
|
||||
e.filename = 'myfile.py'
|
||||
|
||||
msg = self.get_report(e).splitlines()
|
||||
self.assertEqual(msg,
|
||||
['SyntaxError: bad syntax (myfile.py)'])
|
||||
e.lineno = 100
|
||||
msg = self.get_report(e).splitlines()
|
||||
self.assertEqual(msg,
|
||||
[' File "myfile.py", line 100', 'SyntaxError: bad syntax'])
|
||||
class PyExcReportingTests(BaseExceptionReportingTests, unittest.TestCase):
|
||||
#
|
||||
# This checks reporting through the 'traceback' module, with both
|
||||
|
|
|
@ -515,7 +515,8 @@ class TracebackException:
|
|||
if exc_type and issubclass(exc_type, SyntaxError):
|
||||
# Handle SyntaxError's specially
|
||||
self.filename = exc_value.filename
|
||||
self.lineno = str(exc_value.lineno)
|
||||
lno = exc_value.lineno
|
||||
self.lineno = str(lno) if lno is not None else None
|
||||
self.text = exc_value.text
|
||||
self.offset = exc_value.offset
|
||||
self.msg = exc_value.msg
|
||||
|
@ -569,9 +570,12 @@ class TracebackException:
|
|||
return
|
||||
|
||||
# It was a syntax error; show exactly where the problem was found.
|
||||
filename = self.filename or "<string>"
|
||||
lineno = str(self.lineno) or '?'
|
||||
yield ' File "{}", line {}\n'.format(filename, lineno)
|
||||
filename_suffix = ''
|
||||
if self.lineno is not None:
|
||||
yield ' File "{}", line {}\n'.format(
|
||||
self.filename or "<string>", self.lineno)
|
||||
elif self.filename is not None:
|
||||
filename_suffix = ' ({})'.format(self.filename)
|
||||
|
||||
badline = self.text
|
||||
offset = self.offset
|
||||
|
@ -585,7 +589,7 @@ class TracebackException:
|
|||
caretspace = ((c.isspace() and c or ' ') for c in caretspace)
|
||||
yield ' {}^\n'.format(''.join(caretspace))
|
||||
msg = self.msg or "<no detail available>"
|
||||
yield "{}: {}\n".format(stype, msg)
|
||||
yield "{}: {}{}\n".format(stype, msg, filename_suffix)
|
||||
|
||||
def format(self, *, chain=True):
|
||||
"""Format the exception.
|
||||
|
|
Loading…
Reference in New Issue