1. Michael Bayer
  2. mako
  3. Issues

Issues

Issue #71 resolved

format_exception fails if exception occured in child template of inheritance chain

guest
created an issue

Very strange behavior, but:

base.htm

${self.body()}

test.htm

<%inherit file="base.htm" />

should throw exception ${undefined_var}

Test1.htm stuff

test.py

  1. !python import os from mako.lookup import TemplateLookup from mako.template import Template

l = TemplateLookup(directories=[os.getcwd(),]) t = Template(filename='test1.htm', lookup=l, format_exceptions=True)

print t.render()

As a result there will be 3 blank lines :). Expected: formatted error message.

Representable with 0.1.10 and latest trunk.

Problem is in your way of copying context. After Context._copy() copied instance will share all buffers and even buffer list with source Context. This can make a lot of hard-to-find errors. As this :).

mako.runtime, _exec_template(), 332 line:

  1. !python context._buffer_stack = [util.StringIO()]

Here you overwrite buffer stack, but only for current context instance. And expect changes on all Contexts :).

  1. !python c1 = Context() c2 = Context()

c1._buffer_stack => list #1 c2._buffer_stack => list #1 (!) c1._buffer_stack[0] => buff #1 c2._buffer_stack[0] => buff #1

c2._buffer_stack[0].write('asd') c1._buffer_stack[0].getvalue() => 'asd' as expected

c2._buffer_stack = [StringIO] c2._buffer_stack[0] => buff #2 c1._buffer_stack[0] => buff #1 (!!!)

In patch I had also changed the way buffers are created. At least this will allow multilingual template errors messages in the future ;). Also - use cStringIO ONLY for unicode (I mean use cStringIO if non-unicode encoding supplied).

If you dont want that much changes - to fix error problem you just need to replace mako.runtime, _exec_template(), 332 line:

  1. !python context._buffer_stack = [util.StringIO()]

to

  1. !python while context._buffer_stack: del context._buffer_stack[0] context._buffer_stack.append(util.StringIO())

Cheers!

Comments (2)

  1. Michael Bayer repo owner

    OK, sorry we can't change the constructor to `Context` here as it's public API that it takes a buffer as an argument. The `FastEncodingBuffer` is good enough to use for formatting exceptions in all cases. The context collection bug is fixed in d19ff8d39a0ade786db889a980de9d2c1470b377, and the `html_error_template()` encoding is used with format_exceptions in 5214f0f8efba7d1b1fd8186ac12241c44356d0fe. thanks for spotting this.

  2. Log in to comment