« »

Small Django patch to add full traceback for wrapper exception during template rendering

Tuesday, 17 November 2009

Here is a patch that I’m tending to apply to my Django (currently v1.1.1) tree to give me a full traceback on the wrapped exception when getting an exception during template processing. Without this patch you only get the string summary of the underlying exception – often far from enough info to track down the actual bug. With this patch the result isn’t that pretty (a full Python traceback as the string summary of the TemplateSyntaxError), but the info sure is helpful.

Index: debug.py
===================================================================
--- debug.py	(revision 11742)
+++ debug.py	(working copy)
@@ -68,20 +68,23 @@
 class DebugNodeList(NodeList):
     def render_node(self, node, context):
         try:
             result = node.render(context)
         except TemplateSyntaxError, e:
             if not hasattr(e, 'source'):
                 e.source = node.source
             raise
         except Exception, e:
             from sys import exc_info
+            #TODO?: grab the "(at $file:$line)" suffix code, tack that on, propose for Django core
+            import traceback
+            e = traceback.format_exc()
             wrapped = TemplateSyntaxError(u'Caught an exception while rendering: %s' % force_unicode(e, errors='replace'))
             wrapped.source = node.source
             wrapped.exc_info = exc_info()
             raise wrapped
         return result
 
 class DebugVariableNode(VariableNode):
     def render(self, context):
         try:
             output = force_unicode(self.filter_expression.resolve(context))