import string, sys, traceback from Funcs import htmlEncode # @@ 2000-04-10 ce: change these so they're general args to the tags rather than just the colors HTMLForExceptionOptions = { 'table.bgcolor': '#F0F0F0', 'default.fgcolor': '#000000', 'row.location.fgcolor': '#0000AA', 'row.code.fgcolor': '#FF0000' } def HTMLForException(excInfo=None, options=None): """ Returns an HTML string that presents useful information to the developer about the exception. The first argument is a tuple such as returned by sys.exc_info() which is in fact, invoked if the tuple isn't provided. """ # @@ 2000-04-17 ce: Maybe excInfo should default to None and get set to sys.excInfo() if not specified. If so, then clean up other code. # Get the excInfo if needed if excInfo is None: excInfo = sys.exc_info() # Set up the options if options: opt = HTMLForExceptionOptions.copy() opt.update(options) else: opt = HTMLForExceptionOptions # Create the HTML res = [ '<table bgcolor=%s width=100%% cellpadding=4><tr><td>\n' % opt['table.bgcolor'], '<pre><font color=%s>' % opt['default.fgcolor'] ] out = apply(traceback.format_exception, excInfo) for line in out: if string.find(line, 'File ')!=-1: parts = string.split(line, '\n') parts = map(lambda s: htmlEncode(s), parts) parts[0] = '<font color=%s>%s</font>' % (opt['row.location.fgcolor'], parts[0]) parts[1] = '<font color=%s>%s</font>' % (opt['row.code.fgcolor'], parts[1]) line = string.join(parts, '\n') res.append(line) else: res.append(htmlEncode(line)) if out: if res[-1][-1]=='\n': res[-1] = string.rstrip(res[-1]) res.extend([ '</font></pre>', '</td></tr></table>\n' ]) return string.join(res, '')