blob: 5ab3ec6b347890663288ade3a0ca8c3cf1182e16 [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
19 print ' File "%s", line %d, in %s' % (filename, lineno, name)
20 line = linecache.getline(filename, lineno)
21 if line: print ' ' + string.strip(line)
22 tb = tb.tb_next
23 n = n+1
24
25def extract_tb(tb, limit = None):
26 if limit is None:
27 if hasattr(sys, 'tracebacklimit'):
28 limit = sys.tracebacklimit
29 list = []
30 n = 0
31 while tb is not None and (limit is None or n < limit):
32 f = tb.tb_frame
33 lineno = tb.tb_lineno
34 co = f.f_code
35 filename = co.co_filename
36 name = co.co_name
37 line = linecache.getline(filename, lineno)
38 if line: line = string.strip(line)
39 else: line = None
40 list.append(filename, lineno, name, line)
41 tb = tb.tb_next
42 n = n+1
43 return list
44
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000045def print_exception(etype, value, tb, limit = None):
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000046 if tb:
47 print 'Traceback (innermost last):'
48 print_tb(tb, limit)
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000049 if type(etype) == types.ClassType:
50 stype = etype.__name__
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000051 else:
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000052 stype = etype
53 if value is None:
54 print stype
55 else:
56 if etype is SyntaxError:
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000057 try:
58 msg, (filename, lineno, offset, line) = value
59 except:
60 pass
61 else:
62 if not filename: filename = "<string>"
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000063 print ' File "%s", line %d' % \
64 (filename, lineno)
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000065 i = 0
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000066 while i < len(line) and \
67 line[i] in string.whitespace:
Guido van Rossum7aeb4b91994-08-23 13:32:20 +000068 i = i+1
69 s = ' '
70 print s + string.strip(line)
71 for c in line[i:offset-1]:
72 if c in string.whitespace:
73 s = s + c
74 else:
75 s = s + ' '
76 print s + '^'
77 value = msg
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000078 print '%s: %s' % (stype, value)
Guido van Rossum526beed1994-07-01 15:36:46 +000079
80def print_exc(limit = None):
81 print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback,
82 limit)
83
84def print_last(limit = None):
85 print_exception(sys.last_type, sys.last_value, sys.last_traceback,
86 limit)