blob: 7488f157a1641eaaa407aee92ed8e6e6b40c02e6 [file] [log] [blame]
Guido van Rossum526beed1994-07-01 15:36:46 +00001# Format and print Python stack traces
2
3import linecache
4import string
5import sys
Guido van Rossumc7acf2a1995-02-27 13:15:45 +00006import types
Guido van Rossum526beed1994-07-01 15:36:46 +00007
Guido van Rossum194e20a1995-09-20 20:31:51 +00008def _print(file, str='', terminator='\n'):
9 file.write(str+terminator)
Guido van Rossumdcc057a1996-08-12 23:18:13 +000010
11
12def print_list(extracted_list, file=None):
13 if not file:
14 file = sys.stderr
15 for filename, lineno, name, line in extracted_list:
16 _print(file,
17 ' File "%s", line %d, in %s' % (filename,lineno,name))
18 if line:
19 _print(file, ' %s' % string.strip(line))
20
21def format_list(extracted_list):
22 list = []
23 for filename, lineno, name, line in extracted_list:
24 item = ' File "%s", line %d, in %s\n' % (filename,lineno,name)
25 if line:
26 item = item + ' %s\n' % string.strip(line)
27 list.append(item)
28 return list
Guido van Rossum194e20a1995-09-20 20:31:51 +000029
30
31def print_tb(tb, limit=None, file=None):
32 if not file:
33 file = sys.stderr
Guido van Rossum526beed1994-07-01 15:36:46 +000034 if limit is None:
35 if hasattr(sys, 'tracebacklimit'):
36 limit = sys.tracebacklimit
37 n = 0
38 while tb is not None and (limit is None or n < limit):
39 f = tb.tb_frame
40 lineno = tb.tb_lineno
41 co = f.f_code
42 filename = co.co_filename
43 name = co.co_name
Guido van Rossum194e20a1995-09-20 20:31:51 +000044 _print(file,
45 ' File "%s", line %d, in %s' % (filename,lineno,name))
Guido van Rossum526beed1994-07-01 15:36:46 +000046 line = linecache.getline(filename, lineno)
Guido van Rossum194e20a1995-09-20 20:31:51 +000047 if line: _print(file, ' ' + string.strip(line))
Guido van Rossum526beed1994-07-01 15:36:46 +000048 tb = tb.tb_next
49 n = n+1
50
Guido van Rossum28e99fe1995-08-04 04:30:30 +000051def format_tb(tb, limit = None):
Guido van Rossumdcc057a1996-08-12 23:18:13 +000052 return format_list(extract_tb(tb, limit))
Guido van Rossum28e99fe1995-08-04 04:30:30 +000053
Guido van Rossum526beed1994-07-01 15:36:46 +000054def extract_tb(tb, limit = None):
55 if limit is None:
56 if hasattr(sys, 'tracebacklimit'):
57 limit = sys.tracebacklimit
58 list = []
59 n = 0
60 while tb is not None and (limit is None or n < limit):
61 f = tb.tb_frame
62 lineno = tb.tb_lineno
63 co = f.f_code
64 filename = co.co_filename
65 name = co.co_name
66 line = linecache.getline(filename, lineno)
67 if line: line = string.strip(line)
68 else: line = None
Guido van Rossum2715bb21996-10-08 14:06:35 +000069 list.append((filename, lineno, name, line))
Guido van Rossum526beed1994-07-01 15:36:46 +000070 tb = tb.tb_next
71 n = n+1
72 return list
73
Guido van Rossum28e99fe1995-08-04 04:30:30 +000074
Guido van Rossum194e20a1995-09-20 20:31:51 +000075def print_exception(etype, value, tb, limit=None, file=None):
76 if not file:
77 file = sys.stderr
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000078 if tb:
Guido van Rossum194e20a1995-09-20 20:31:51 +000079 _print(file, 'Traceback (innermost last):')
80 print_tb(tb, limit, file)
81 lines = format_exception_only(etype, value)
82 for line in lines[:-1]:
83 _print(file, line, ' ')
84 _print(file, lines[-1], '')
Guido van Rossum28e99fe1995-08-04 04:30:30 +000085
86def format_exception(etype, value, tb, limit = None):
87 if tb:
88 list = ['Traceback (innermost last):\n']
89 list = list + format_tb(tb, limit)
90 list = list + format_exception_only(etype, value)
91 return list
92
93def format_exception_only(etype, value):
94 list = []
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000095 if type(etype) == types.ClassType:
96 stype = etype.__name__
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000097 else:
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000098 stype = etype
99 if value is None:
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000100 list.append(str(stype) + '\n')
Guido van Rossumc7acf2a1995-02-27 13:15:45 +0000101 else:
102 if etype is SyntaxError:
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000103 try:
104 msg, (filename, lineno, offset, line) = value
105 except:
106 pass
107 else:
108 if not filename: filename = "<string>"
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000109 list.append(' File "%s", line %d\n' %
110 (filename, lineno))
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000111 i = 0
Guido van Rossumc7acf2a1995-02-27 13:15:45 +0000112 while i < len(line) and \
113 line[i] in string.whitespace:
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000114 i = i+1
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000115 list.append(' %s\n' % string.strip(line))
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000116 s = ' '
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000117 for c in line[i:offset-1]:
118 if c in string.whitespace:
119 s = s + c
120 else:
121 s = s + ' '
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000122 list.append('%s^\n' % s)
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000123 value = msg
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000124 list.append('%s: %s\n' % (str(stype), str(value)))
125 return list
126
Guido van Rossum526beed1994-07-01 15:36:46 +0000127
Guido van Rossum194e20a1995-09-20 20:31:51 +0000128def print_exc(limit=None, file=None):
129 if not file:
130 file = sys.stderr
Guido van Rossum526beed1994-07-01 15:36:46 +0000131 print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback,
Guido van Rossum194e20a1995-09-20 20:31:51 +0000132 limit, file)
Guido van Rossum526beed1994-07-01 15:36:46 +0000133
Guido van Rossum194e20a1995-09-20 20:31:51 +0000134def print_last(limit=None, file=None):
135 if not file:
136 file = sys.stderr
Guido van Rossum526beed1994-07-01 15:36:46 +0000137 print_exception(sys.last_type, sys.last_value, sys.last_traceback,
Guido van Rossum194e20a1995-09-20 20:31:51 +0000138 limit, file)
Guido van Rossumdcc057a1996-08-12 23:18:13 +0000139
140
141def print_stack(f=None, limit=None, file=None):
142 if f is None:
143 try:
144 raise ZeroDivisionError
145 except ZeroDivisionError:
146 tb = sys.exc_traceback
147 f = tb.tb_frame.f_back
148 print_list(extract_stack(f, limit), file)
149
150def format_stack(f=None, limit=None):
151 if f is None:
152 try:
153 raise ZeroDivisionError
154 except ZeroDivisionError:
155 tb = sys.exc_traceback
156 f = tb.tb_frame.f_back
157 return format_list(extract_stack(t, limit))
158
159def extract_stack(f=None, limit = None):
160 if f is None:
161 try:
162 raise ZeroDivisionError
163 except ZeroDivisionError:
164 tb = sys.exc_traceback
165 f = tb.tb_frame.f_back
166 if limit is None:
167 if hasattr(sys, 'tracebacklimit'):
168 limit = sys.tracebacklimit
169 list = []
170 n = 0
171 while f is not None and (limit is None or n < limit):
172 lineno = f.f_lineno
173 co = f.f_code
174 filename = co.co_filename
175 name = co.co_name
176 line = linecache.getline(filename, lineno)
177 if line: line = string.strip(line)
178 else: line = None
Guido van Rossum2715bb21996-10-08 14:06:35 +0000179 list.append((filename, lineno, name, line))
Guido van Rossumdcc057a1996-08-12 23:18:13 +0000180 f = f.f_back
181 n = n+1
182 list.reverse()
183 return list