use reraise function for error_handler
diff --git a/mako/compat.py b/mako/compat.py
index e26b65b..fe277bb 100644
--- a/mako/compat.py
+++ b/mako/compat.py
@@ -68,6 +68,18 @@
             fp.close()
 
 
+if py3k:
+    def reraise(tp, value, tb=None, cause=None):
+        if cause is not None:
+            value.__cause__ = cause
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+else:
+    exec("def reraise(tp, value, tb=None, cause=None):\n"
+            "    raise tp, value, tb\n")
+
+
 def exception_as():
     return sys.exc_info()[1]
 
diff --git a/mako/runtime.py b/mako/runtime.py
index c968264..31ad557 100644
--- a/mako/runtime.py
+++ b/mako/runtime.py
@@ -852,25 +852,18 @@
         try:
             callable_(context, *args, **kwargs)
         except Exception:
-            _render_error(template, context, compat.exception_as(), sys.exc_info())
+            _render_error(template, context, compat.exception_as())
         except:
             e = sys.exc_info()[0]
             _render_error(template, context, e)
     else:
         callable_(context, *args, **kwargs)
 
-def _render_error(template, context, error, exc_info=None):
+def _render_error(template, context, error):
     if template.error_handler:
         result = template.error_handler(context, error)
         if not result:
-            if exc_info:
-                t, v, tb = exc_info
-                if sys.version_info[0] <= 2:
-                    exec('raise v, None, tb.tb_next')
-                else:
-                    raise v.with_traceback(tb.tb_next)
-            else:
-                raise error
+            compat.reraise(*sys.exc_info())
     else:
         error_template = exceptions.html_error_template()
         if context._outputting_as_unicode: