blob: acb26dbb558a0d9bd2bf6b1ff41f3c3544b1ffae [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 Ronacher62ccd1b2009-01-04 14:26:19 +01008 :copyright: (c) 2009 by the Jinja Team.
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
Armin Ronacher1d021082009-02-19 20:07:13 +010016 def __init__(self, message=None):
17 if message is not None:
18 message = unicode(message).encode('utf-8')
19 Exception.__init__(self, message)
20
21 @property
22 def message(self):
23 if self.args:
24 message = self.args[0]
25 if message is not None:
26 return message.decode('utf-8', 'replace')
27
Armin Ronacher9a822052008-04-17 18:44:07 +020028
Armin Ronacher07bc6842008-03-31 14:18:49 +020029class TemplateNotFound(IOError, LookupError, TemplateError):
Armin Ronacher9a822052008-04-17 18:44:07 +020030 """Raised if a template does not exist."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020031
Armin Ronacher31bbd9e2010-01-14 00:41:30 +010032 # looks weird, but removes the warning descriptor that just
33 # bogusly warns us about message being deprecated
34 message = None
35
36 def __init__(self, name, message=None):
37 IOError.__init__(self)
38 if message is None:
39 message = name
40 self.message = message
Armin Ronacher07bc6842008-03-31 14:18:49 +020041 self.name = name
Armin Ronacher31bbd9e2010-01-14 00:41:30 +010042 self.templates = [name]
43
44 def __unicode__(self):
45 return self.message
46
47 def __str__(self):
48 return self.message.encode('utf-8')
49
50
51class TemplatesNotFound(TemplateNotFound):
52 """Like :class:`TemplateNotFound` but raised if multiple templates
53 are selected. This is a subclass of :class:`TemplateNotFound`
54 exception, so just catching the base exception will catch both.
55
56 .. versionadded:: 2.2
57 """
58
59 def __init__(self, names=(), message=None):
60 if message is None:
61 message = u'non of the templates given were found: ' + \
Armin Ronacher7e40df02010-01-14 00:54:47 +010062 u', '.join(map(unicode, names))
Armin Ronacher31bbd9e2010-01-14 00:41:30 +010063 TemplateNotFound.__init__(self, names and names[-1] or None, message)
64 self.templates = list(names)
Armin Ronacher07bc6842008-03-31 14:18:49 +020065
66
Armin Ronacher68f77672008-04-17 11:50:39 +020067class TemplateSyntaxError(TemplateError):
Armin Ronacher9a822052008-04-17 18:44:07 +020068 """Raised to tell the user that there is a problem with the template."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020069
Armin Ronacher7f15ef82008-05-16 09:11:39 +020070 def __init__(self, message, lineno, name=None, filename=None):
Armin Ronacher1d021082009-02-19 20:07:13 +010071 TemplateError.__init__(self, message)
Armin Ronacher07bc6842008-03-31 14:18:49 +020072 self.lineno = lineno
Armin Ronacher7f15ef82008-05-16 09:11:39 +020073 self.name = name
Armin Ronacheraaf010d2008-05-01 13:14:30 +020074 self.filename = filename
Armin Ronacherccae0552008-10-05 23:08:58 +020075 self.source = None
Armin Ronacherccae0552008-10-05 23:08:58 +020076
Armin Ronacherd416a972009-02-24 22:58:00 +010077 # this is set to True if the debug.translate_syntax_error
78 # function translated the syntax error into a new traceback
79 self.translated = False
80
Armin Ronacherccae0552008-10-05 23:08:58 +020081 def __unicode__(self):
Armin Ronacherd416a972009-02-24 22:58:00 +010082 # for translated errors we only return the message
83 if self.translated:
84 return self.message.encode('utf-8')
85
86 # otherwise attach some stuff
Armin Ronacherccae0552008-10-05 23:08:58 +020087 location = 'line %d' % self.lineno
88 name = self.filename or self.name
89 if name:
90 location = 'File "%s", %s' % (name, location)
91 lines = [self.message, ' ' + location]
92
93 # if the source is set, add the line to the output
94 if self.source is not None:
95 try:
96 line = self.source.splitlines()[self.lineno - 1]
97 except IndexError:
98 line = None
99 if line:
100 lines.append(' ' + line.strip())
101
102 return u'\n'.join(lines)
103
104 def __str__(self):
105 return unicode(self).encode('utf-8')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200106
107
Armin Ronacher53042292008-04-26 18:30:19 +0200108class TemplateAssertionError(TemplateSyntaxError):
Armin Ronacher9a822052008-04-17 18:44:07 +0200109 """Like a template syntax error, but covers cases where something in the
110 template caused an error at compile time that wasn't necessarily caused
Armin Ronacherf3c35c42008-05-23 23:18:14 +0200111 by a syntax error. However it's a direct subclass of
112 :exc:`TemplateSyntaxError` and has the same attributes.
Armin Ronacher9a822052008-04-17 18:44:07 +0200113 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200114
Armin Ronachere791c2a2008-04-07 18:39:54 +0200115
Armin Ronacher07bc6842008-03-31 14:18:49 +0200116class TemplateRuntimeError(TemplateError):
Armin Ronacherf3c35c42008-05-23 23:18:14 +0200117 """A generic runtime error in the template engine. Under some situations
118 Jinja may raise this exception.
119 """
Benjamin Wieganda3152742008-04-28 18:07:52 +0200120
121
Armin Ronacherf3c35c42008-05-23 23:18:14 +0200122class UndefinedError(TemplateRuntimeError):
123 """Raised if a template tries to operate on :class:`Undefined`."""
124
125
126class SecurityError(TemplateRuntimeError):
127 """Raised if a template tries to do something insecure if the
128 sandbox is enabled.
129 """
130
131
132class FilterArgumentError(TemplateRuntimeError):
Benjamin Wieganda3152742008-04-28 18:07:52 +0200133 """This error is raised if a filter was called with inappropriate
134 arguments
135 """