I grew tired of scrolling down through the very long tracbacks to get
to the actual error, so I wrote a function that lets me skip
everything up to my handler function. While I was at it I figured I
may as well highlight the things I want to see to make the tracebacks
easier to read. When I was finished I liked it so much I had to share,
it would be nice if this found it's way into mod_python. To adapt it
for your purposes, change the condition func == 'handler' to something
else (you probably don't want to cut out the call to handler like me.)
Please excuse my lousy html, I wrote it to be small so it didn't
clutter up my source, I hate html in my python code. Feel free to
change whatever you like.

-Dan

import sys, os, re, traceback

re_traceback = re.compile(r'File "(?P<file>[^"]+?)", line
(?P<line>\d+?), in (?P<func>.+?)\s+(?P<context>.+?)$',
                         re.DOTALL | re.MULTILINE)

def get_formatted_traceback(req):
  ''' Returns an html formatted traceback for the exception. '''

  req.content_type = 'text/html'

  buf = ['<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"',
         '"http://www.w3.org/TR/html4/loose.dtd";>',
         '<html><head>',
         '<style type="text/css">',
         'b { color: navy }',
         'strong { color: green }',
         '.context { font-style: italic; margin-left: 30px }',
         '.trace { margin: 10px }'
         'span { font-weight: bold; color: blue }',
         '</style>',
         '</head><body>']

  begin_trace = False
  for e in traceback.format_exception(*sys.exc_info()):
     m = re_traceback.search(e)
     if m is not None:
        path, line, func, context = m.group('file', 'line', 'func', 'context')
        path, filename = os.path.split(path)
        if begin_trace:
           buf.append('<div>File "%s\<b>%s</b>", line %s, in
<strong>%s</strong>\r\n<div class="context">%s</div></div>' \
                      % (path, filename, line, func, context))
        else:
           # Ignore the stuff up to and including the entry point of
the application at the call to handler
           if func == 'handler': begin_trace = True
     else:
        if begin_trace: buf.append('</div><span>%s</span>' % e) #
Last Line (the error)
        else: buf.append('%s<div class="trace">' % e) # First line (Traceback:)

  buf.append('</body></html>')
  return '\r\n'.join(buf)

Reply via email to