blob: 8d2dfdc379f1a6b8f25b94b0374d19e0381690f6 [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)
10
11
12def print_tb(tb, limit=None, file=None):
13 if not file:
14 file = sys.stderr
Guido van Rossum526beed1994-07-01 15:36:46 +000015 if limit is None:
16 if hasattr(sys, 'tracebacklimit'):
17 limit = sys.tracebacklimit
18 n = 0
19 while tb is not None and (limit is None or n < limit):
20 f = tb.tb_frame
21 lineno = tb.tb_lineno
22 co = f.f_code
23 filename = co.co_filename
24 name = co.co_name
Guido van Rossum194e20a1995-09-20 20:31:51 +000025 _print(file,
26 ' File "%s", line %d, in %s' % (filename,lineno,name))
Guido van Rossum526beed1994-07-01 15:36:46 +000027 line = linecache.getline(filename, lineno)
Guido van Rossum194e20a1995-09-20 20:31:51 +000028 if line: _print(file, ' ' + string.strip(line))
Guido van Rossum526beed1994-07-01 15:36:46 +000029 tb = tb.tb_next
30 n = n+1
31
Guido van Rossum28e99fe1995-08-04 04:30:30 +000032def format_tb(tb, limit = None):
33 list = []
34 for filename, lineno, name, line in extract_tb(tb, limit):
35 item = ' File "%s", line %d, in %s\n' % (filename,lineno,name)
36 if line:
37 item = item + ' %s\n' % string.strip(line)
38 list.append(item)
39 return list
40
Guido van Rossum526beed1994-07-01 15:36:46 +000041def extract_tb(tb, limit = None):
42 if limit is None:
43 if hasattr(sys, 'tracebacklimit'):
44 limit = sys.tracebacklimit
45 list = []
46 n = 0
47 while tb is not None and (limit is None or n < limit):
48 f = tb.tb_frame
49 lineno = tb.tb_lineno
50 co = f.f_code
51 filename = co.co_filename
52 name = co.co_name
53 line = linecache.getline(filename, lineno)
54 if line: line = string.strip(line)
55 else: line = None
56 list.append(filename, lineno, name, line)
57 tb = tb.tb_next
58 n = n+1
59 return list
60
Guido van Rossum28e99fe1995-08-04 04:30:30 +000061
Guido van Rossum194e20a1995-09-20 20:31:51 +000062def print_exception(etype, value, tb, limit=None, file=None):
63 if not file:
64 file = sys.stderr
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000065 if tb:
Guido van Rossum194e20a1995-09-20 20:31:51 +000066 _print(file, 'Traceback (innermost last):')
67 print_tb(tb, limit, file)
68 lines = format_exception_only(etype, value)
69 for line in lines[:-1]:
70 _print(file, line, ' ')
71 _print(file, lines[-1], '')
Guido van Rossum28e99fe1995-08-04 04:30:30 +000072
73def format_exception(etype, value, tb, limit = None):
74 if tb:
75 list = ['Traceback (innermost last):\n']
76 list = list + format_tb(tb, limit)
77 list = list + format_exception_only(etype, value)
78 return list
79
80def format_exception_only(etype, value):
81 list = []
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000082 if type(etype) == types.ClassType:
83 stype = etype.__name__
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000084 else:
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000085 stype = etype
86 if value is None:
Guido van Rossum28e99fe1995-08-04 04:30:30 +000087 list.append(str(stype) + '\n')
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000088 else:
89 if etype is SyntaxError:
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000090 try:
91 msg, (filename, lineno, offset, line) = value
92 except:
93 pass
94 else:
95 if not filename: filename = "<string>"
Guido van Rossum28e99fe1995-08-04 04:30:30 +000096 list.append(' File "%s", line %d\n' %
97 (filename, lineno))
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000098 i = 0
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000099 while i < len(line) and \
100 line[i] in string.whitespace:
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000101 i = i+1
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000102 list.append(' %s\n' % string.strip(line))
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000103 s = ' '
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000104 for c in line[i:offset-1]:
105 if c in string.whitespace:
106 s = s + c
107 else:
108 s = s + ' '
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000109 list.append('%s^\n' % s)
Guido van Rossum7aeb4b91994-08-23 13:32:20 +0000110 value = msg
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000111 list.append('%s: %s\n' % (str(stype), str(value)))
112 return list
113
Guido van Rossum526beed1994-07-01 15:36:46 +0000114
Guido van Rossum194e20a1995-09-20 20:31:51 +0000115def print_exc(limit=None, file=None):
116 if not file:
117 file = sys.stderr
Guido van Rossum526beed1994-07-01 15:36:46 +0000118 print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback,
Guido van Rossum194e20a1995-09-20 20:31:51 +0000119 limit, file)
Guido van Rossum526beed1994-07-01 15:36:46 +0000120
Guido van Rossum194e20a1995-09-20 20:31:51 +0000121def print_last(limit=None, file=None):
122 if not file:
123 file = sys.stderr
Guido van Rossum526beed1994-07-01 15:36:46 +0000124 print_exception(sys.last_type, sys.last_value, sys.last_traceback,
Guido van Rossum194e20a1995-09-20 20:31:51 +0000125 limit, file)