summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib/stackviewer.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/idlelib/stackviewer.py')
-rw-r--r--Lib/idlelib/stackviewer.py41
1 files changed, 9 insertions, 32 deletions
diff --git a/Lib/idlelib/stackviewer.py b/Lib/idlelib/stackviewer.py
index 94ffb4e..7b00c4c 100644
--- a/Lib/idlelib/stackviewer.py
+++ b/Lib/idlelib/stackviewer.py
@@ -1,33 +1,30 @@
import linecache
import os
-import sys
import tkinter as tk
from idlelib.debugobj import ObjectTreeItem, make_objecttreeitem
from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas
-def StackBrowser(root, flist=None, tb=None, top=None):
+def StackBrowser(root, exc, flist=None, top=None):
global sc, item, node # For testing.
if top is None:
top = tk.Toplevel(root)
sc = ScrolledCanvas(top, bg="white", highlightthickness=0)
sc.frame.pack(expand=1, fill="both")
- item = StackTreeItem(flist, tb)
+ item = StackTreeItem(exc, flist)
node = TreeNode(sc.canvas, None, item)
node.expand()
class StackTreeItem(TreeItem):
- def __init__(self, flist=None, tb=None):
+ def __init__(self, exc, flist=None):
self.flist = flist
- self.stack = self.get_stack(tb)
- self.text = self.get_exception()
+ self.stack = self.get_stack(None if exc is None else exc.__traceback__)
+ self.text = f"{type(exc).__name__}: {str(exc)}"
def get_stack(self, tb):
- if tb is None:
- tb = sys.last_traceback
stack = []
if tb and tb.tb_frame is None:
tb = tb.tb_next
@@ -36,17 +33,7 @@ class StackTreeItem(TreeItem):
tb = tb.tb_next
return stack
- def get_exception(self):
- type = sys.last_type
- value = sys.last_value
- if hasattr(type, "__name__"):
- type = type.__name__
- s = str(type)
- if value is not None:
- s = s + ": " + str(value)
- return s
-
- def GetText(self):
+ def GetText(self): # Titlecase names are overrides.
return self.text
def GetSubList(self):
@@ -133,19 +120,9 @@ def _stack_viewer(parent): # htest #
flist = PyShellFileList(top)
try: # to obtain a traceback object
intentional_name_error
- except NameError:
- exc_type, exc_value, exc_tb = sys.exc_info()
- # inject stack trace to sys
- sys.last_type = exc_type
- sys.last_value = exc_value
- sys.last_traceback = exc_tb
-
- StackBrowser(top, flist=flist, top=top, tb=exc_tb)
-
- # restore sys to original state
- del sys.last_type
- del sys.last_value
- del sys.last_traceback
+ except NameError as e:
+ StackBrowser(top, e, flist=flist, top=top)
+
if __name__ == '__main__':
from unittest import main