From 2f0441f03f71c658148bff60be46585f56670d1f Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Thu, 5 Mar 2015 15:45:01 +1300 Subject: [PATCH] Remaining fallout from 17911 The code module was using a private function from traceback in order to skip a frame - used the direct interface to do that instead, The decimal module suffered minor fallout from formatting changes ('None' as a value is now not printed by traceback, the same as None was not before). The cgitb module was passing a bogus exception type (type.__name__) into format_exception, which uncovered that format_exception and print_exception had been ignoring the etype for some time, so the compatibility thunk to the new code now does the same thing. --- Lib/_pydecimal.py | 2 +- Lib/code.py | 33 ++++++++------------------------- Lib/traceback.py | 10 ++++++++-- 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/Lib/_pydecimal.py b/Lib/_pydecimal.py index ca6c4bd98d4..88222be0546 100644 --- a/Lib/_pydecimal.py +++ b/Lib/_pydecimal.py @@ -4108,7 +4108,7 @@ class Context(object): >>> context.create_decimal_from_float(3.1415926535897932) Traceback (most recent call last): ... - decimal.Inexact: None + decimal.Inexact """ d = Decimal.from_float(f) # An exact conversion diff --git a/Lib/code.py b/Lib/code.py index 86e1f032607..53244e32ad6 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -140,32 +140,15 @@ class InteractiveInterpreter: sys.last_type, sys.last_value, last_tb = ei = sys.exc_info() sys.last_traceback = last_tb try: - lines = [] - for value, tb in traceback._iter_chain(*ei[1:]): - if isinstance(value, str): - lines.append(value) - lines.append('\n') - continue - if tb: - tblist = traceback.extract_tb(tb) - if tb is last_tb: - # The last traceback includes the frame we - # exec'd in - del tblist[:1] - tblines = traceback.format_list(tblist) - if tblines: - lines.append("Traceback (most recent call last):\n") - lines.extend(tblines) - lines.extend(traceback.format_exception_only(type(value), - value)) + lines = traceback.format_exception(ei[0], ei[1], last_tb.tb_next) + if sys.excepthook is sys.__excepthook__: + self.write(''.join(lines)) + else: + # If someone has set sys.excepthook, we let that take precedence + # over self.write + sys.excepthook(ei[0], ei[1], last_tb) finally: - tblist = last_tb = ei = None - if sys.excepthook is sys.__excepthook__: - self.write(''.join(lines)) - else: - # If someone has set sys.excepthook, we let that take precedence - # over self.write - sys.excepthook(type, value, last_tb) + last_tb = ei = None def write(self, data): """Write a string. diff --git a/Lib/traceback.py b/Lib/traceback.py index 22544acd187..72e1e2a9f93 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -89,10 +89,13 @@ def print_exception(etype, value, tb, limit=None, file=None, chain=True): occurred with a caret on the next line indicating the approximate position of the error. """ + # format_exception has ignored etype for some time, and code such as cgitb + # passes in bogus values as a result. For compatibility with such code we + # ignore it here (rather than in the new TracebackException API). if file is None: file = sys.stderr for line in TracebackException( - etype, value, tb, limit=limit).format(chain=chain): + type(value), value, tb, limit=limit).format(chain=chain): print(line, file=file, end="") @@ -105,8 +108,11 @@ def format_exception(etype, value, tb, limit=None, chain=True): these lines are concatenated and printed, exactly the same text is printed as does print_exception(). """ + # format_exception has ignored etype for some time, and code such as cgitb + # passes in bogus values as a result. For compatibility with such code we + # ignore it here (rather than in the new TracebackException API). return list(TracebackException( - etype, value, tb, limit=limit).format(chain=chain)) + type(value), value, tb, limit=limit).format(chain=chain)) def format_exception_only(etype, value):