Mercurial > cpython-lru_cache-weakref
annotate Lib/traceback.py @ 3546:3f7cdf1663f7 legacy-trunk
A version of swed that can import html files. Also demonstrates
implementing object handlers in Python.
| author | Jack Jansen <jack.jansen@cwi.nl> |
|---|---|
| date | Tue, 07 May 1996 15:25:36 +0000 |
| parents | 9497cdcdb6aa |
| children | 8d50a96f8680 |
| rev | line source |
|---|---|
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 # Format and print Python stack traces |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
2 # |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
3 # updated to take optional "file" named parameter |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
4 # by Tommy Burnette, 9/20/95 |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 import linecache |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 import string |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 import sys |
|
2440
d577d749918d
handle class exceptions
Guido van Rossum <guido@python.org>
parents:
1810
diff
changeset
|
9 import types |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
11 def _print(file, str='', terminator='\n'): |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
12 file.write(str+terminator) |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
13 |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
14 |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
15 def print_tb(tb, limit=None, file=None): |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
16 if not file: |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
17 file = sys.stderr |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 if limit is None: |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 if hasattr(sys, 'tracebacklimit'): |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 limit = sys.tracebacklimit |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 n = 0 |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 while tb is not None and (limit is None or n < limit): |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 f = tb.tb_frame |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
24 lineno = tb.tb_lineno |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 co = f.f_code |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
26 filename = co.co_filename |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 name = co.co_name |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
28 _print(file, |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
29 ' File "%s", line %d, in %s' % (filename,lineno,name)) |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
30 line = linecache.getline(filename, lineno) |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
31 if line: _print(file, ' ' + string.strip(line)) |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 tb = tb.tb_next |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
33 n = n+1 |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
34 |
|
2901
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
35 def format_tb(tb, limit = None): |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
36 list = [] |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
37 for filename, lineno, name, line in extract_tb(tb, limit): |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
38 item = ' File "%s", line %d, in %s\n' % (filename,lineno,name) |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
39 if line: |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
40 item = item + ' %s\n' % string.strip(line) |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
41 list.append(item) |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
42 return list |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
43 |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 def extract_tb(tb, limit = None): |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 if limit is None: |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 if hasattr(sys, 'tracebacklimit'): |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 limit = sys.tracebacklimit |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 list = [] |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 n = 0 |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 while tb is not None and (limit is None or n < limit): |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
51 f = tb.tb_frame |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 lineno = tb.tb_lineno |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 co = f.f_code |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
54 filename = co.co_filename |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 name = co.co_name |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 line = linecache.getline(filename, lineno) |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 if line: line = string.strip(line) |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
58 else: line = None |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
59 list.append(filename, lineno, name, line) |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 tb = tb.tb_next |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 n = n+1 |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
62 return list |
|
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
63 |
|
2901
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
64 |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
65 def print_exception(etype, value, tb, limit=None, file=None): |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
66 if not file: |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
67 file = sys.stderr |
|
1810
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
68 if tb: |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
69 _print(file, 'Traceback (innermost last):') |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
70 print_tb(tb, limit, file) |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
71 lines = format_exception_only(etype, value) |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
72 for line in lines[:-1]: |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
73 _print(file, line, ' ') |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
74 _print(file, lines[-1], '') |
|
2901
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
75 |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
76 def format_exception(etype, value, tb, limit = None): |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
77 if tb: |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
78 list = ['Traceback (innermost last):\n'] |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
79 list = list + format_tb(tb, limit) |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
80 list = list + format_exception_only(etype, value) |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
81 return list |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
82 |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
83 def format_exception_only(etype, value): |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
84 list = [] |
|
2440
d577d749918d
handle class exceptions
Guido van Rossum <guido@python.org>
parents:
1810
diff
changeset
|
85 if type(etype) == types.ClassType: |
|
d577d749918d
handle class exceptions
Guido van Rossum <guido@python.org>
parents:
1810
diff
changeset
|
86 stype = etype.__name__ |
|
d577d749918d
handle class exceptions
Guido van Rossum <guido@python.org>
parents:
1810
diff
changeset
|
87 else: |
|
d577d749918d
handle class exceptions
Guido van Rossum <guido@python.org>
parents:
1810
diff
changeset
|
88 stype = etype |
|
1810
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
89 if value is None: |
|
2901
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
90 list.append(str(stype) + '\n') |
|
1810
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
91 else: |
|
2440
d577d749918d
handle class exceptions
Guido van Rossum <guido@python.org>
parents:
1810
diff
changeset
|
92 if etype is SyntaxError: |
|
1810
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
93 try: |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
94 msg, (filename, lineno, offset, line) = value |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
95 except: |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
96 pass |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
97 else: |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
98 if not filename: filename = "<string>" |
|
2901
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
99 list.append(' File "%s", line %d\n' % |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
100 (filename, lineno)) |
|
1810
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
101 i = 0 |
|
2440
d577d749918d
handle class exceptions
Guido van Rossum <guido@python.org>
parents:
1810
diff
changeset
|
102 while i < len(line) and \ |
|
d577d749918d
handle class exceptions
Guido van Rossum <guido@python.org>
parents:
1810
diff
changeset
|
103 line[i] in string.whitespace: |
|
1810
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
104 i = i+1 |
|
2901
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
105 list.append(' %s\n' % string.strip(line)) |
|
1810
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
106 s = ' ' |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
107 for c in line[i:offset-1]: |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
108 if c in string.whitespace: |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
109 s = s + c |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
110 else: |
|
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
111 s = s + ' ' |
|
2901
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
112 list.append('%s^\n' % s) |
|
1810
d892ac4b4fb9
* Lib/linecache.py: don't crash on empty filename
Guido van Rossum <guido@python.org>
parents:
1699
diff
changeset
|
113 value = msg |
|
2901
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
114 list.append('%s: %s\n' % (str(stype), str(value))) |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
115 return list |
|
57ec24e0f35a
added format_* functions (suggestion by Ken M)
Guido van Rossum <guido@python.org>
parents:
2440
diff
changeset
|
116 |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
117 |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
118 def print_exc(limit=None, file=None): |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
119 if not file: |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
120 file = sys.stderr |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
121 print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
122 limit, file) |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
124 def print_last(limit=None, file=None): |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
125 if not file: |
|
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
126 file = sys.stderr |
|
1699
93df83022be8
New module, formats traceback just like the C code does
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 print_exception(sys.last_type, sys.last_value, sys.last_traceback, |
|
3115
9497cdcdb6aa
add file parameter to all printing fns, default stderr
Guido van Rossum <guido@python.org>
parents:
2901
diff
changeset
|
128 limit, file) |
