From 2a791926b9d69c02f54c10a62c4c1ce5e6ac40ab Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Thu, 16 Apr 2009 23:15:22 +0200 Subject: [PATCH] Fixed a bug with template syntax errors not handled properly. --HG-- branch : trunk --- jinja2/debug.py | 16 +++++++++++++--- jinja2/environment.py | 9 ++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/jinja2/debug.py b/jinja2/debug.py index ce794e2..beceecb 100644 --- a/jinja2/debug.py +++ b/jinja2/debug.py @@ -86,7 +86,10 @@ def make_traceback(exc_info, source_hint=None): exc_type, exc_value, tb = exc_info if isinstance(exc_value, TemplateSyntaxError): exc_info = translate_syntax_error(exc_value, source_hint) - return translate_exception(exc_info) + initial_skip = 0 + else: + initial_skip = 1 + return translate_exception(exc_info, initial_skip) def translate_syntax_error(error, source=None): @@ -100,13 +103,19 @@ def translate_syntax_error(error, source=None): return fake_exc_info(exc_info, filename, error.lineno) -def translate_exception(exc_info): +def translate_exception(exc_info, initial_skip=0): """If passed an exc_info it will automatically rewrite the exceptions all the way down to the correct line numbers and frames. """ - initial_tb = tb = exc_info[2].tb_next + tb = exc_info[2] frames = [] + # skip some internal frames if wanted + for x in xrange(initial_skip): + if tb is not None: + tb = tb.tb_next + initial_tb = tb + while tb is not None: # skip frames decorated with @internalcode. These are internal # calls we can't avoid and that are useless in template debugging @@ -133,6 +142,7 @@ def translate_exception(exc_info): # reraise it unchanged. # XXX: can we backup here? when could this happen? if not frames: + print "bummer" raise exc_info[0], exc_info[1], exc_info[2] traceback = ProcessedTraceback(exc_info[0], exc_info[1], frames) diff --git a/jinja2/environment.py b/jinja2/environment.py index c2fee16..09705c1 100644 --- a/jinja2/environment.py +++ b/jinja2/environment.py @@ -368,7 +368,7 @@ class Environment(object): filename = filename.encode('utf-8') try: return Parser(self, source, name, filename).parse() - except TemplateSyntaxError, e: + except TemplateSyntaxError: self.handle_exception(sys.exc_info(), source_hint=source) def lex(self, source, name=None, filename=None): @@ -384,7 +384,7 @@ class Environment(object): source = unicode(source) try: return self.lexer.tokeniter(source, name, filename) - except TemplateSyntaxError, e: + except TemplateSyntaxError: self.handle_exception(sys.exc_info(), source_hint=source) def preprocess(self, source, name=None, filename=None): @@ -469,9 +469,8 @@ class Environment(object): raise TemplateSyntaxError('chunk after expression', parser.stream.current.lineno, None, None) - except TemplateSyntaxError, e: - e.source = source - raise e + except TemplateSyntaxError: + self.handle_exception(sys.exc_info(), source_hint=source) body = [nodes.Assign(nodes.Name('result', 'store'), expr, lineno=1)] template = self.from_string(nodes.Template(body, lineno=1)) return TemplateExpression(template, undefined_to_none) -- 2.26.2