[go: up one dir, main page]

Menu

[4d509f]: / roundup / cgitb.py  Maximize  Restore  History

Download this file

158 lines (140 with data), 5.5 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#
# This module was written by Ka-Ping Yee, <ping@lfw.org>.
#
# $Id: cgitb.py,v 1.10 2002-01-16 04:49:45 richard Exp $
__doc__ = """
Extended CGI traceback handler by Ka-Ping Yee, <ping@lfw.org>.
"""
import sys, os, types, string, keyword, linecache, tokenize, inspect, pydoc
from i18n import _
def breaker():
return ('<body bgcolor="#f0f0ff">' +
'<font color="#f0f0ff" size="-5"> > </font> ' +
'</table>' * 5)
def html(context=5):
etype, evalue = sys.exc_type, sys.exc_value
if type(etype) is types.ClassType:
etype = etype.__name__
pyver = 'Python ' + string.split(sys.version)[0] + '<br>' + sys.executable
head = pydoc.html.heading(
'<font size=+1><strong>%s</strong>: %s</font>'%(str(etype), str(evalue)),
'#ffffff', '#aa55cc', pyver)
head = head + (_('<p>A problem occurred while running a Python script. '
'Here is the sequence of function calls leading up to '
'the error, with the most recent (innermost) call first. '
'The exception attributes are:'))
indent = '<tt><small>%s</small>&nbsp;</tt>' % ('&nbsp;' * 5)
traceback = []
for frame, file, lnum, func, lines, index in inspect.trace(context):
if file is None:
link = '&lt;file is None - probably inside <tt>eval</tt> or <tt>exec</tt>&gt;'
else:
file = os.path.abspath(file)
link = '<a href="file:%s">%s</a>' % (file, pydoc.html.escape(file))
args, varargs, varkw, locals = inspect.getargvalues(frame)
if func == '?':
call = ''
else:
call = 'in <strong>%s</strong>' % func + inspect.formatargvalues(
args, varargs, varkw, locals,
formatvalue=lambda value: '=' + pydoc.html.repr(value))
level = '''
<table width="100%%" bgcolor="#d8bbff" cellspacing=0 cellpadding=2 border=0>
<tr><td>%s %s</td></tr></table>''' % (link, call)
if index is None or file is None:
traceback.append('<p>' + level)
continue
# do a fil inspection
names = []
def tokeneater(type, token, start, end, line, names=names):
if type == tokenize.NAME and token not in keyword.kwlist:
if token not in names:
names.append(token)
if type == tokenize.NEWLINE: raise IndexError
def linereader(file=file, lnum=[lnum]):
line = linecache.getline(file, lnum[0])
lnum[0] = lnum[0] + 1
return line
try:
tokenize.tokenize(linereader, tokeneater)
except IndexError: pass
lvals = []
for name in names:
if name in frame.f_code.co_varnames:
if locals.has_key(name):
value = pydoc.html.repr(locals[name])
else:
value = _('<em>undefined</em>')
name = '<strong>%s</strong>' % name
else:
if frame.f_globals.has_key(name):
value = pydoc.html.repr(frame.f_globals[name])
else:
value = _('<em>undefined</em>')
name = '<em>global</em> <strong>%s</strong>' % name
lvals.append('%s&nbsp;= %s' % (name, value))
if lvals:
lvals = string.join(lvals, ', ')
lvals = indent + '''
<small><font color="#909090">%s</font></small><br>''' % lvals
else:
lvals = ''
excerpt = []
i = lnum - index
for line in lines:
number = '&nbsp;' * (5-len(str(i))) + str(i)
number = '<small><font color="#909090">%s</font></small>' % number
line = '<tt>%s&nbsp;%s</tt>' % (number, pydoc.html.preformat(line))
if i == lnum:
line = '''
<table width="100%%" bgcolor="#ffccee" cellspacing=0 cellpadding=0 border=0>
<tr><td>%s</td></tr></table>''' % line
excerpt.append('\n' + line)
if i == lnum:
excerpt.append(lvals)
i = i + 1
traceback.append('<p>' + level + string.join(excerpt, '\n'))
traceback.reverse()
exception = '<p><strong>%s</strong>: %s' % (str(etype), str(evalue))
attribs = []
if type(evalue) is types.InstanceType:
for name in dir(evalue):
value = pydoc.html.repr(getattr(evalue, name))
attribs.append('<br>%s%s&nbsp;= %s' % (indent, name, value))
return head + string.join(attribs) + string.join(traceback) + '<p>&nbsp;</p>'
def handler():
print breaker()
print html()
#
# $Log: not supported by cvs2svn $
# Revision 1.9 2002/01/08 11:56:24 richard
# missed an import _
#
# Revision 1.8 2002/01/05 02:22:32 richard
# i18n'ification
#
# Revision 1.7 2001/11/22 15:46:42 jhermann
# Added module docstrings to all modules.
#
# Revision 1.6 2001/09/29 13:27:00 richard
# CGI interfaces now spit up a top-level index of all the instances they can
# serve.
#
# Revision 1.5 2001/08/07 00:24:42 richard
# stupid typo
#
# Revision 1.4 2001/08/07 00:15:51 richard
# Added the copyright/license notice to (nearly) all files at request of
# Bizar Software.
#
# Revision 1.3 2001/07/29 07:01:39 richard
# Added vim command to all source so that we don't get no steenkin' tabs :)
#
# Revision 1.2 2001/07/22 12:09:32 richard
# Final commit of Grande Splite
#
# Revision 1.1 2001/07/22 11:58:35 richard
# More Grande Splite
#
#
# vim: set filetype=python ts=4 sw=4 et si