summaryrefslogtreecommitdiffstats
path: root/Lib/code.py
diff options
context:
space:
mode:
authorRobert Collins <rbtcollins@hp.com>2015-03-05 02:45:01 (GMT)
committerRobert Collins <rbtcollins@hp.com>2015-03-05 02:45:01 (GMT)
commit2f0441f03f71c658148bff60be46585f56670d1f (patch)
treed02581d83fa5628fd8e2ec474d1b58747438f365 /Lib/code.py
parent3737e600f444b230ef2284fa326443990903b25e (diff)
downloadcpython-2f0441f03f71c658148bff60be46585f56670d1f.zip
cpython-2f0441f03f71c658148bff60be46585f56670d1f.tar.gz
cpython-2f0441f03f71c658148bff60be46585f56670d1f.tar.bz2
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.
Diffstat (limited to 'Lib/code.py')
-rw-r--r--Lib/code.py33
1 files changed, 8 insertions, 25 deletions
diff --git a/Lib/code.py b/Lib/code.py
index 86e1f03..53244e3 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.