diff --git a/mako/exceptions.py b/mako/exceptions.py
index b8b7747e7722a81d097a12ef1942264bfc942cab..daba4fd9714739e29cb79e82a30f2bb5bae72e83 100644
--- a/mako/exceptions.py
+++ b/mako/exceptions.py
@@ -72,12 +72,18 @@ class RichTraceback(object):
     reverse_traceback - the traceback list in reverse
     
     """
-    def __init__(self, traceback=None):
+    def __init__(self, error=None, traceback=None):
         (self.source, self.lineno) = ("", 0)
-        (t, self.error, self.records) = self._init(traceback)
-        if self.error is None:
-            self.error = t
-        if isinstance(self.error, CompileException) or isinstance(self.error, SyntaxException):
+
+        if error is None or traceback is None:
+            t, value, traceback = sys.exc_info()
+            self.error = value or t
+        else:
+            self.error = error
+            
+        self.records = self._init(traceback)
+            
+        if isinstance(self.error, (CompileException, SyntaxException)):
             import mako.template
             self.source = self.error.source
             self.lineno = self.error.lineno
@@ -106,13 +112,20 @@ class RichTraceback(object):
                 yield (rec[4], rec[5], rec[2], rec[6])
             else:
                 yield tuple(rec[0:4])
-    traceback = property(lambda self:self._get_reformatted_records(self.records), doc="""
-        return a list of 4-tuple traceback records (i.e. normal python format)
-        with template-corresponding lines remapped to the originating template
-    """)
-    reverse_traceback = property(lambda self:self._get_reformatted_records(self.reverse_records), doc="""
-        return the same data as traceback, except in reverse order
-    """)
+                
+    @property
+    def traceback(self):
+        """return a list of 4-tuple traceback records (i.e. normal python format)
+            with template-corresponding lines remapped to the originating template
+        """
+        return self._get_reformatted_records(self.records)
+    
+    @property
+    def reverse_traceback(self):
+        """return the same data as traceback, except in reverse order
+        """
+        return self._get_reformatted_records(self.reverse_records)
+
     def _init(self, trcback):
         """format a traceback from sys.exc_info() into 7-item tuples, containing
         the regular four traceback tuple items, plus the original template 
@@ -120,8 +133,6 @@ class RichTraceback(object):
         code line from that line number of the template."""
         import mako.template
         mods = {}
-        if not trcback:
-            (type, value, trcback) = sys.exc_info()
         rawrecords = traceback.extract_tb(trcback)
         new_trcback = []
         for filename, lineno, function, line in rawrecords:
@@ -190,7 +201,7 @@ class RichTraceback(object):
                 except IOError:
                     self.source = ''
                 self.lineno = new_trcback[-1][1]
-        return (type, value, new_trcback)
+        return new_trcback
 
                 
 def text_error_template(lookup=None):
@@ -199,12 +210,12 @@ def text_error_template(lookup=None):
     source template, as applicable."""
     import mako.template
     return mako.template.Template(r"""
-<%page args="traceback=None"/>
+<%page args="error=None, traceback=None"/>
 <%!
     from mako.exceptions import RichTraceback
 %>\
 <%
-    tback = RichTraceback(traceback=traceback)
+    tback = RichTraceback(error=error, traceback=traceback)
 %>\
 Traceback (most recent call last):
 % for (filename, lineno, function, line) in tback.traceback:
@@ -229,7 +240,7 @@ def html_error_template():
 <%!
     from mako.exceptions import RichTraceback
 %>
-<%page args="full=True, css=True, traceback=None"/>
+<%page args="full=True, css=True, error=None, traceback=None"/>
 % if full:
 <html>
 <head>
@@ -254,7 +265,7 @@ def html_error_template():
 
 <h2>Error !</h2>
 <%
-    tback = RichTraceback(traceback=traceback)
+    tback = RichTraceback(error=error, traceback=traceback)
     src = tback.source
     line = tback.lineno
     if src: