blob: 5bfca660d0158198b57c609be95f8472ce2a0208 [file] [log] [blame]
Armin Ronacher07bc6842008-03-31 14:18:49 +02001# -*- coding: utf-8 -*-
2"""
Armin Ronacher26c0f512008-04-17 11:16:01 +02003 jinja2.exceptions
4 ~~~~~~~~~~~~~~~~~
Armin Ronacher07bc6842008-03-31 14:18:49 +02005
6 Jinja exceptions.
7
Armin Ronacherd1342312008-04-28 12:20:12 +02008 :copyright: 2008 by Armin Ronacher.
Armin Ronacher07bc6842008-03-31 14:18:49 +02009 :license: BSD, see LICENSE for more details.
10"""
11
12
Armin Ronachere791c2a2008-04-07 18:39:54 +020013class TemplateError(Exception):
Armin Ronacher9a822052008-04-17 18:44:07 +020014 """Baseclass for all template errors."""
15
16
Armin Ronacher07bc6842008-03-31 14:18:49 +020017class TemplateNotFound(IOError, LookupError, TemplateError):
Armin Ronacher9a822052008-04-17 18:44:07 +020018 """Raised if a template does not exist."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020019
20 def __init__(self, name):
21 IOError.__init__(self, name)
22 self.name = name
23
24
Armin Ronacher68f77672008-04-17 11:50:39 +020025class TemplateSyntaxError(TemplateError):
Armin Ronacher9a822052008-04-17 18:44:07 +020026 """Raised to tell the user that there is a problem with the template."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020027
Armin Ronacher7f15ef82008-05-16 09:11:39 +020028 def __init__(self, message, lineno, name=None, filename=None):
Armin Ronacherccae0552008-10-05 23:08:58 +020029 if not isinstance(message, unicode):
30 message = message.decode('utf-8', 'replace')
31 TemplateError.__init__(self, message.encode('utf-8'))
Armin Ronacher07bc6842008-03-31 14:18:49 +020032 self.lineno = lineno
Armin Ronacher7f15ef82008-05-16 09:11:39 +020033 self.name = name
Armin Ronacheraaf010d2008-05-01 13:14:30 +020034 self.filename = filename
Armin Ronacherccae0552008-10-05 23:08:58 +020035 self.source = None
36 self.message = message
37
38 def __unicode__(self):
39 location = 'line %d' % self.lineno
40 name = self.filename or self.name
41 if name:
42 location = 'File "%s", %s' % (name, location)
43 lines = [self.message, ' ' + location]
44
45 # if the source is set, add the line to the output
46 if self.source is not None:
47 try:
48 line = self.source.splitlines()[self.lineno - 1]
49 except IndexError:
50 line = None
51 if line:
52 lines.append(' ' + line.strip())
53
54 return u'\n'.join(lines)
55
56 def __str__(self):
57 return unicode(self).encode('utf-8')
Armin Ronacher07bc6842008-03-31 14:18:49 +020058
59
Armin Ronacher53042292008-04-26 18:30:19 +020060class TemplateAssertionError(TemplateSyntaxError):
Armin Ronacher9a822052008-04-17 18:44:07 +020061 """Like a template syntax error, but covers cases where something in the
62 template caused an error at compile time that wasn't necessarily caused
Armin Ronacherf3c35c42008-05-23 23:18:14 +020063 by a syntax error. However it's a direct subclass of
64 :exc:`TemplateSyntaxError` and has the same attributes.
Armin Ronacher9a822052008-04-17 18:44:07 +020065 """
Armin Ronachere791c2a2008-04-07 18:39:54 +020066
Armin Ronachere791c2a2008-04-07 18:39:54 +020067
Armin Ronacher07bc6842008-03-31 14:18:49 +020068class TemplateRuntimeError(TemplateError):
Armin Ronacherf3c35c42008-05-23 23:18:14 +020069 """A generic runtime error in the template engine. Under some situations
70 Jinja may raise this exception.
71 """
Benjamin Wieganda3152742008-04-28 18:07:52 +020072
73
Armin Ronacherf3c35c42008-05-23 23:18:14 +020074class UndefinedError(TemplateRuntimeError):
75 """Raised if a template tries to operate on :class:`Undefined`."""
76
77
78class SecurityError(TemplateRuntimeError):
79 """Raised if a template tries to do something insecure if the
80 sandbox is enabled.
81 """
82
83
84class FilterArgumentError(TemplateRuntimeError):
Benjamin Wieganda3152742008-04-28 18:07:52 +020085 """This error is raised if a filter was called with inappropriate
86 arguments
87 """