blob: 36e9e699885088910f4f50d87b15950d367a3e8a [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
8def print_tb(tb, limit = None):
9 if limit is None:
10 if hasattr(sys, 'tracebacklimit'):
11 limit = sys.tracebacklimit
12 n = 0
13 while tb is not None and (limit is None or n < limit):
14 f = tb.tb_frame
15 lineno = tb.tb_lineno
16 co = f.f_code
17 filename = co.co_filename
18 name = co.co_name
Guido van Rossum28e99fe1995-08-04 04:30:30 +000019 print ' File "%s", line %d, in %s' % (filename,lineno,name)
Guido van Rossum526beed1994-07-01 15:36:46 +000020 line = linecache.getline(filename, lineno)
21 if line: print ' ' + string.strip(line)
22 tb = tb.tb_next
23 n = n+1
24
Guido van Rossum28e99fe1995-08-04 04:30:30 +000025def format_tb(tb, limit = None):
26 list = []
27 for filename, lineno, name, line in extract_tb(tb, limit):
28 item = ' File "%s", line %d, in %s\n' % (filename,lineno,name)
29 if line:
30 item = item + ' %s\n' % string.strip(line)
31 list.append(item)
32 return list
33
Guido van Rossum526beed1994-07-01 15:36:46 +000034def extract_tb(tb, limit = None):
35 if limit is None:
36 if hasattr(sys, 'tracebacklimit'):
37 limit = sys.tracebacklimit
38 list = []
39 n = 0
40 while tb is not None and (limit is None or n < limit):
41 f = tb.tb_frame
42 lineno = tb.tb_lineno
43 co = f.f_code
44 filename = co.co_filename
45 name = co.co_name
46 line = linecache.getline(filename, lineno)
47 if line: line = string.strip(line)
48 else: line = None
49 list.append(filename, lineno, name, line)
50 tb = tb.tb_next
51 n = n+1
52 return list
53
Guido van Rossum28e99fe1995-08-04 04:30:30 +000054
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000055def print_exception(etype, value, tb, limit = None):
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000056 if tb:
57 print 'Traceback (innermost last):'
58 print_tb(tb, limit)
Guido van Rossum28e99fe1995-08-04 04:30:30 +000059 for line in format_exception_only(etype, value):
60 print line,
61
62def format_exception(etype, value, tb, limit = None):
63 if tb:
64 list = ['Traceback (innermost last):\n']
65 list = list + format_tb(tb, limit)
66 list = list + format_exception_only(etype, value)
67 return list
68
69def format_exception_only(etype, value):
70 list = []
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000071 if type(etype) == types.ClassType:
72 stype = etype.__name__
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000073 else:
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000074 stype = etype
75 if value is None:
Guido van Rossum28e99fe1995-08-04 04:30:30 +000076 list.append(str(stype) + '\n')
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000077 else:
78 if etype is SyntaxError:
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000079 try:
80 msg, (filename, lineno, offset, line) = value
81 except:
82 pass
83 else:
84 if not filename: filename = "<string>"
Guido van Rossum28e99fe1995-08-04 04:30:30 +000085 list.append(' File "%s", line %d\n' %
86 (filename, lineno))
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000087 i = 0
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000088 while i < len(line) and \
89 line[i] in string.whitespace:
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000090 i = i+1
Guido van Rossum28e99fe1995-08-04 04:30:30 +000091 list.append(' %s\n' % string.strip(line))
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000092 s = ' '
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000093 for c in line[i:offset-1]:
94 if c in string.whitespace:
95 s = s + c
96 else:
97 s = s + ' '
Guido van Rossum28e99fe1995-08-04 04:30:30 +000098 list.append('%s^\n' % s)
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000099 value = msg
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000100 list.append('%s: %s\n' % (str(stype), str(value)))
101 return list
102
Guido van Rossum526beed1994-07-01 15:36:46 +0000103
104def print_exc(limit = None):
105 print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback,
106 limit)
107
108def print_last(limit = None):
109 print_exception(sys.last_type, sys.last_value, sys.last_traceback,
110 limit)