From c3f417dc47b3a9564608c98cd176c530d9ebdf09 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Fri, 24 Jul 2015 17:36:21 +0300 Subject: Issue #24695: Fix a regression in traceback.print_exception() If exc_traceback is None we shouldn't print a traceback header like described in the documentation. --- Lib/test/test_traceback.py | 13 +++++++++++++ Lib/traceback.py | 4 +++- Misc/NEWS | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index e8c4d74..641a2df 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -209,6 +209,13 @@ class SyntaxTracebackCases(unittest.TestCase): b'ZeroDivisionError: division by zero'] self.assertEqual(stderr.splitlines(), expected) + def test_print_exception(self): + output = StringIO() + traceback.print_exception( + Exception, Exception("projector"), None, file=output + ) + self.assertEqual(output.getvalue(), "Exception: projector\n") + class TracebackFormatTests(unittest.TestCase): @@ -848,6 +855,12 @@ class TestTracebackException(unittest.TestCase): exc = traceback.TracebackException(Exception, e, tb) self.assertEqual(exc.stack[0].locals, None) + def test_traceback_header(self): + # do not print a traceback header if exc_traceback is None + # see issue #24695 + exc = traceback.TracebackException(Exception, Exception("haven"), None) + self.assertEqual(list(exc.format()), ["Exception: haven\n"]) + class MiscTest(unittest.TestCase): diff --git a/Lib/traceback.py b/Lib/traceback.py index 61c9fb5..02edeb6 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -453,6 +453,7 @@ class TracebackException: _seen=_seen) else: context = None + self.exc_traceback = exc_traceback self.__cause__ = cause self.__context__ = context self.__suppress_context__ = \ @@ -561,6 +562,7 @@ class TracebackException: not self.__suppress_context__): yield from self.__context__.format(chain=chain) yield _context_message - yield 'Traceback (most recent call last):\n' + if self.exc_traceback is not None: + yield 'Traceback (most recent call last):\n' yield from self.stack.format() yield from self.format_exception_only() diff --git a/Misc/NEWS b/Misc/NEWS index b75bead..b5b3559 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -28,6 +28,10 @@ Core and Builtins Library ------- +- Issue #24695: Fix a regression in traceback.print_exception(). If + exc_traceback is None we shouldn't print a traceback header like described + in the documentation. + - Issue #24620: Random.setstate() now validates the value of state last element. - Issue #22485: Fixed an issue that caused `inspect.getsource` to return incorrect -- cgit v0.12