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()
|
||||
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):
|
||||
# A message that looks like "None" should not be treated specially
|
||||
err = self.get_report(Exception(None))
|
||||
|
|
|
@ -525,7 +525,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
|
||||
|
@ -584,9 +585,12 @@ class TracebackException:
|
|||
def _format_syntax_error(self, stype):
|
||||
"""Format SyntaxError exceptions (internal helper)."""
|
||||
# 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)
|
||||
|
||||
text = self.text
|
||||
if text is not None:
|
||||
|
@ -604,7 +608,7 @@ class TracebackException:
|
|||
caretspace = ((c if c.isspace() else ' ') for c in ltext[:caret])
|
||||
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.
|
||||
|
|
|
@ -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