Issue #27348: Restore “Exception: None” formatting in traceback module

This fixes a regression caused by revision 73afda5a4e4c. Also reverts the
decimal test workaround added in revision 5f3dd0a2b1ab.

Remove test_without_exception(). According to revision ecaafc32c500, this was
added in Python 2 so that print_exc() would output “None” when called with no
exception set. However print_exc() never worked like this in Python 3, and
the use case is not documented.

Restore TracebackCases class name (instead of SyntaxTracebackCases), because
the class also tests other exceptions.
This commit is contained in:
Martin Panter 2016-09-22 09:37:39 +00:00
parent 92bb90a9ff
commit bb8b1cb6af
4 changed files with 18 additions and 7 deletions

View File

@ -4106,7 +4106,7 @@ class Context(object):
>>> context.create_decimal_from_float(3.1415926535897932) >>> context.create_decimal_from_float(3.1415926535897932)
Traceback (most recent call last): Traceback (most recent call last):
... ...
decimal.Inexact decimal.Inexact: None
""" """
d = Decimal.from_float(f) # An exact conversion d = Decimal.from_float(f) # An exact conversion

View File

@ -19,7 +19,7 @@ test_frame = namedtuple('frame', ['f_code', 'f_globals', 'f_locals'])
test_tb = namedtuple('tb', ['tb_frame', 'tb_lineno', 'tb_next']) test_tb = namedtuple('tb', ['tb_frame', 'tb_lineno', 'tb_next'])
class SyntaxTracebackCases(unittest.TestCase): class TracebackCases(unittest.TestCase):
# For now, a very minimal set of tests. I want to be sure that # For now, a very minimal set of tests. I want to be sure that
# formatting of SyntaxErrors works based on changes for 2.1. # formatting of SyntaxErrors works based on changes for 2.1.
@ -106,10 +106,6 @@ class SyntaxTracebackCases(unittest.TestCase):
str_name = '.'.join([X.__module__, X.__qualname__]) str_name = '.'.join([X.__module__, X.__qualname__])
self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value)) self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value))
def test_without_exception(self):
err = traceback.format_exception_only(None, None)
self.assertEqual(err, ['None\n'])
def test_encoded_file(self): def test_encoded_file(self):
# Test that tracebacks are correctly printed for encoded source files: # Test that tracebacks are correctly printed for encoded source files:
# - correct line number (Issue2384) # - correct line number (Issue2384)
@ -456,6 +452,17 @@ class BaseExceptionReportingTests:
msg = self.get_report(e).splitlines() msg = self.get_report(e).splitlines()
self.assertEqual(msg[-2], ' ^') self.assertEqual(msg[-2], ' ^')
def test_message_none(self):
# A message that looks like "None" should not be treated specially
err = self.get_report(Exception(None))
self.assertIn('Exception: None\n', err)
err = self.get_report(Exception('None'))
self.assertIn('Exception: None\n', err)
err = self.get_report(Exception())
self.assertIn('Exception\n', err)
err = self.get_report(Exception(''))
self.assertIn('Exception\n', err)
class PyExcReportingTests(BaseExceptionReportingTests, unittest.TestCase): class PyExcReportingTests(BaseExceptionReportingTests, unittest.TestCase):
# #

View File

@ -140,7 +140,7 @@ def format_exception_only(etype, value):
def _format_final_exc_line(etype, value): def _format_final_exc_line(etype, value):
valuestr = _some_str(value) valuestr = _some_str(value)
if value == 'None' or value is None or not valuestr: if value is None or not valuestr:
line = "%s\n" % etype line = "%s\n" % etype
else: else:
line = "%s: %s\n" % (etype, valuestr) line = "%s: %s\n" % (etype, valuestr)

View File

@ -77,6 +77,10 @@ Core and Builtins
Library Library
------- -------
- Issue #27348: In the traceback module, restore the formatting of exception
messages like "Exception: None". This fixes a regression introduced in
3.5a2.
- Issue #25651: Allow falsy values to be used for msg parameter of subTest(). - Issue #25651: Allow falsy values to be used for msg parameter of subTest().
- Issue #27932: Prevent memory leak in win32_ver(). - Issue #27932: Prevent memory leak in win32_ver().