Sunday, November 24, 2013

mako二三事 -- Exceptions

mako模板运行前,会被编译成py文件,因此一旦有模板中有问题,python抛出的出错信息(如文件名、行号、出错代码等)都是针对该py文件的,因此mako需要将这些Exceptions信息转换成模板对应的信息。

如python抛出的exception内容为:
  File "/tmp/basic.html.py", line 49, in render_body
    __M_writer(unicode(no1_value)) 

mako转换过之后的exception内容为:
  File "/dir1/basic.html", line 12, in render_body
    None value=${no1_value}
 


mako.exceptions是mako用于处理异常的主要代码,主要函数包括:


一、text_error_template
text_error_template用于输出文本格式的异常信息。例如: 

from mako import exceptions
try:
    mylookup = TemplateLookup(directories=['/dir1' ], input_encoding="utf-8", module_directory='/tmp')
    mytemplate = mylookup.get_template("basic.html")
    print mytemplate.render()
except:
    print exceptions.text_error_template().render() 


二、html_error_template
html_error_template用于输出HTML格式的异常信息。例如: 

from mako import exceptions
try:
    mylookup = TemplateLookup(directories=['/dir1' ], input_encoding="utf-8", module_directory='/tmp')
    mytemplate = mylookup.get_template("basic.html")
    print mytemplate.render()
except:
    print exceptions.html_error_template().render()  

html_error_template函数带 full、css两个参数,默认都是True。
full参数表示是否生成完整的HTML页面结构,即带等信息。
css参数表示是否生成自带的CSS信息。 
通过指定这两个参数,可以将异常页面更好的融合到应用系统中。

Template类、TemplateLookup类都有一个format_exceptions,置为True,则mako默认将所有exception都转出html格式,即便是用text_error_template输出。


三、RichTraceback
mako生成上述出错信息的底层信息类就是RichTraceback,可以通过RichTraceback生成用户自定义的出错信息格式。from mako.exceptions import RichTraceback

try:
    mylookup = TemplateLookup(directories=['/dir1' ], input_encoding="utf-8", module_directory='/tmp')
    template = mylookup.get_template("basic.html")
    print template.render()
except:
    traceback = RichTraceback()
    for (filename, lineno, function, line) in traceback.traceback:
        print "File %s, line %s, in %s" % (filename, lineno, function)
        print line, "\n"
    print "%s: %s" % (str(traceback.error.__class__.__name__), traceback.error)

traceback.traceback为调用栈列表。 
traceback.errorname为exception名称
traceback.lineno为模板行数
traceback.message为出错信息

No comments:

Post a Comment