7
7
from idlelib .debugobj import ObjectTreeItem , make_objecttreeitem
8
8
from idlelib .tree import TreeNode , TreeItem , ScrolledCanvas
9
9
10
- def StackBrowser (root , flist = None , tb = None , top = None ):
10
+ def StackBrowser (root , flist = None , exc = None , top = None ):
11
11
global sc , item , node # For testing.
12
12
if top is None :
13
13
top = tk .Toplevel (root )
14
14
sc = ScrolledCanvas (top , bg = "white" , highlightthickness = 0 )
15
15
sc .frame .pack (expand = 1 , fill = "both" )
16
- item = StackTreeItem (flist , tb )
16
+ item = StackTreeItem (flist , exc )
17
17
node = TreeNode (sc .canvas , None , item )
18
18
node .expand ()
19
19
20
20
21
21
class StackTreeItem (TreeItem ):
22
22
23
- def __init__ (self , flist = None , tb = None ):
23
+ def __init__ (self , flist = None , exc = None ):
24
+ assert isinstance (exc , BaseException )
24
25
self .flist = flist
25
- self .stack = self .get_stack (tb )
26
- self .text = self .get_exception ()
26
+ self .stack = self .get_stack (exc . __traceback__ )
27
+ self .text = self .get_exception (exc )
27
28
28
29
def get_stack (self , tb ):
29
- if tb is None :
30
- tb = sys .last_traceback
31
30
stack = []
32
31
if tb and tb .tb_frame is None :
33
32
tb = tb .tb_next
@@ -36,14 +35,12 @@ def get_stack(self, tb):
36
35
tb = tb .tb_next
37
36
return stack
38
37
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 )
38
+ def get_exception (self , exc ):
39
+ assert isinstance (exc , BaseException )
40
+ typ = type (exc )
41
+ if hasattr (typ , "__name__" ):
42
+ typ = typ .__name__
43
+ s = str (typ ) + ": " + str (exc )
47
44
return s
48
45
49
46
def GetText (self ):
@@ -133,19 +130,11 @@ def _stack_viewer(parent): # htest #
133
130
flist = PyShellFileList (top )
134
131
try : # to obtain a traceback object
135
132
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
133
+ except NameError as e :
134
+ exc = e
135
+
136
+ StackBrowser (top , flist = flist , top = top , tb = exc )
137
+
149
138
150
139
if __name__ == '__main__' :
151
140
from unittest import main
0 commit comments