]> granicus.if.org Git - python/commitdiff
Remaining fallout from 17911
authorRobert Collins <rbtcollins@hp.com>
Thu, 5 Mar 2015 02:45:01 +0000 (15:45 +1300)
committerRobert Collins <rbtcollins@hp.com>
Thu, 5 Mar 2015 02:45:01 +0000 (15:45 +1300)
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
Lib/code.py
Lib/traceback.py

index ca6c4bd98d416d7d1c3ab168928e9317cc0dc9e0..88222be05464a7f67e85b95fb86d1ef6428afce7 100644 (file)
@@ -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
index 86e1f03260784d31e83195e2cf791b6edbc8c0a9..53244e32ad684bd083529337e50347b5724206d3 100644 (file)
@@ -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.
index 22544acd187426eabe1bba352d2b5cb3e29ab73f..72e1e2a9f93affaf1646c3c94a3a69fab7256c06 100644 (file)
@@ -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):