Question

I'm looking for a way to catch mako runtime errors using Bottle.

Runtime errors in python are catched using the following code:

# main.py
from lib import errors
import bottle

app = bottle.app()
app.error_handler = errors.handler
...

# lib/errors.py
from bottle import mako_template as template

def custom500(error):
    return template('error/500')

handler = {
    500: custom500
}

This works flawlessly, as exceptions are turned into 500 Internal Server Error.

I'd like to catch the mako runtime errors in a similar fashion, does anyone have a clue of how to achieve this?

Was it helpful?

Solution

You want to catch mako.exceptions.SyntaxException.

This code works for me:

@bottle.route('/hello')
def hello():
    try:
        return bottle.mako_template('hello')

    except mako.exceptions.SyntaxException as exx:
        return 'mako exception: {}\n'.format(exx)

EDIT: Per your comment, here are some pointers on how to install this globally. Install a bottle plugin that wraps your functions in the mako.exceptions.SyntaxException try block.

Something along these lines:

@bottle.route('/hello')
def hello():
    return bottle.mako_template('hello')

def catch_mako_errors(callback):
    def wrapper(*args, **kwargs):
        try:
            return callback(*args, **kwargs)
        except mako.exceptions.SyntaxException as exx:
            return 'mako exception: {}\n'.format(exx)
    return wrapper

bottle.install(catch_mako_errors)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top