11import linecache
22import os
3- import sys
43
54import tkinter as tk
65
76from idlelib .debugobj import ObjectTreeItem , make_objecttreeitem
87from idlelib .tree import TreeNode , TreeItem , ScrolledCanvas
98
10- def StackBrowser (root , flist = None , tb = None , top = None ):
9+ def StackBrowser (root , exc , flist = None , top = None ):
1110 global sc , item , node # For testing.
1211 if top is None :
1312 top = tk .Toplevel (root )
1413 sc = ScrolledCanvas (top , bg = "white" , highlightthickness = 0 )
1514 sc .frame .pack (expand = 1 , fill = "both" )
16- item = StackTreeItem (flist , tb )
15+ item = StackTreeItem (exc , flist )
1716 node = TreeNode (sc .canvas , None , item )
1817 node .expand ()
1918
2019
2120class StackTreeItem (TreeItem ):
2221
23- def __init__ (self , flist = None , tb = None ):
22+ def __init__ (self , exc , flist = None ):
2423 self .flist = flist
25- self .stack = self .get_stack (tb )
26- self .text = self . get_exception ()
24+ self .stack = self .get_stack (None if exc is None else exc . __traceback__ )
25+ self .text = f" { type ( exc ). __name__ } : { str ( exc ) } "
2726
2827 def get_stack (self , tb ):
29- if tb is None :
30- tb = sys .last_traceback
3128 stack = []
3229 if tb and tb .tb_frame is None :
3330 tb = tb .tb_next
@@ -36,17 +33,7 @@ def get_stack(self, tb):
3633 tb = tb .tb_next
3734 return stack
3835
39- def get_exception (self ):
40- type = sys .last_type
41- value = sys .last_value
42- if hasattr (type , "__name__" ):
43- type = type .__name__
44- s = str (type )
45- if value is not None :
46- s = s + ": " + str (value )
47- return s
48-
49- def GetText (self ):
36+ def GetText (self ): # Titlecase names are overrides.
5037 return self .text
5138
5239 def GetSubList (self ):
@@ -133,19 +120,9 @@ def _stack_viewer(parent): # htest #
133120 flist = PyShellFileList (top )
134121 try : # to obtain a traceback object
135122 intentional_name_error
136- except NameError :
137- exc_type , exc_value , exc_tb = sys .exc_info ()
138- # inject stack trace to sys
139- sys .last_type = exc_type
140- sys .last_value = exc_value
141- sys .last_traceback = exc_tb
142-
143- StackBrowser (top , flist = flist , top = top , tb = exc_tb )
144-
145- # restore sys to original state
146- del sys .last_type
147- del sys .last_value
148- del sys .last_traceback
123+ except NameError as e :
124+ StackBrowser (top , e , flist = flist , top = top )
125+
149126
150127if __name__ == '__main__' :
151128 from unittest import main
0 commit comments