You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mod_python-dev@quetz.apache.org by Dan Eloff <da...@gmail.com> on 2006/08/17 05:00:24 UTC

HTML formatted traceback

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)