bpo-34463: Make python tracebacks identical to C tracebacks for SyntaxErrors without a lineno (GH-23427)
This commit is contained in:
parent
6afb730e2a
commit
069560b117
|
@ -687,6 +687,31 @@ class BaseExceptionReportingTests:
|
||||||
msg = self.get_report(e).splitlines()
|
msg = self.get_report(e).splitlines()
|
||||||
self.assertEqual(msg[-2], ' ^')
|
self.assertEqual(msg[-2], ' ^')
|
||||||
|
|
||||||
|
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'])
|
||||||
|
|
||||||
def test_message_none(self):
|
def test_message_none(self):
|
||||||
# A message that looks like "None" should not be treated specially
|
# A message that looks like "None" should not be treated specially
|
||||||
err = self.get_report(Exception(None))
|
err = self.get_report(Exception(None))
|
||||||
|
|
|
@ -525,7 +525,8 @@ class TracebackException:
|
||||||
if exc_type and issubclass(exc_type, SyntaxError):
|
if exc_type and issubclass(exc_type, SyntaxError):
|
||||||
# Handle SyntaxError's specially
|
# Handle SyntaxError's specially
|
||||||
self.filename = exc_value.filename
|
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.text = exc_value.text
|
||||||
self.offset = exc_value.offset
|
self.offset = exc_value.offset
|
||||||
self.msg = exc_value.msg
|
self.msg = exc_value.msg
|
||||||
|
@ -584,9 +585,12 @@ class TracebackException:
|
||||||
def _format_syntax_error(self, stype):
|
def _format_syntax_error(self, stype):
|
||||||
"""Format SyntaxError exceptions (internal helper)."""
|
"""Format SyntaxError exceptions (internal helper)."""
|
||||||
# Show exactly where the problem was found.
|
# Show exactly where the problem was found.
|
||||||
filename = self.filename or "<string>"
|
filename_suffix = ''
|
||||||
lineno = str(self.lineno) or '?'
|
if self.lineno is not None:
|
||||||
yield ' File "{}", line {}\n'.format(filename, lineno)
|
yield ' File "{}", line {}\n'.format(
|
||||||
|
self.filename or "<string>", self.lineno)
|
||||||
|
elif self.filename is not None:
|
||||||
|
filename_suffix = ' ({})'.format(self.filename)
|
||||||
|
|
||||||
text = self.text
|
text = self.text
|
||||||
if text is not None:
|
if text is not None:
|
||||||
|
@ -604,7 +608,7 @@ class TracebackException:
|
||||||
caretspace = ((c if c.isspace() else ' ') for c in ltext[:caret])
|
caretspace = ((c if c.isspace() else ' ') for c in ltext[:caret])
|
||||||
yield ' {}^\n'.format(''.join(caretspace))
|
yield ' {}^\n'.format(''.join(caretspace))
|
||||||
msg = self.msg or "<no detail available>"
|
msg = self.msg or "<no detail available>"
|
||||||
yield "{}: {}\n".format(stype, msg)
|
yield "{}: {}{}\n".format(stype, msg, filename_suffix)
|
||||||
|
|
||||||
def format(self, *, chain=True):
|
def format(self, *, chain=True):
|
||||||
"""Format the exception.
|
"""Format the exception.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fixed discrepancy between :mod:`traceback` and the interpreter in formatting of SyntaxError with lineno not set (:mod:`traceback` was changed to match interpreter).
|
Loading…
Reference in New Issue