Error al manejar con Python + Pylons

¿Cuál es la forma correcta de manejar los errores con Python + Pylons?

Digamos que un usuario establece una contraseña a través de un formulario que, cuando se pasa a una clase de modelo a través del controlador, arroja un error porque es demasiado corto. ¿Cómo debe manejarse ese error para que se muestre un mensaje de error en la página web en lugar de que todo el script termine en una página de error?

¿Debería haber algún manejo de errores en el controlador?

Espero que me esté explicando claramente.

Gracias.

    ¿Qué estás usando para validar tus formularios? Estoy usando formalchemy . Valida los datos de entrada utilizando validadores incorporados y personalizados, y alimenta una lista con los errores que encuentra. A continuación, puede mostrar esa lista de la forma que desee en su plantilla.

    Documentación aquí .

    Yo uso formencode @validate decorator. Es posible escribir un validador personalizado para él, pero el problema con el manejo de las excepciones que ocurren en el modelo después de la validación aún existe.

    Podría escribir un decorador de acciones personalizado similar a formencode uno que manejará las excepciones de su modelo y rellenará c.form_errors.

    No pretendo ser una solución lista para la producción, solo como un ejemplo. En realidad, he copiado la mayoría del código de decorador de pylons.decorators:

    from decorator import decorator from webob import UnicodeMultiDict class ModelException(Exception): pass def handle_exceptions(form): def wrapper(fn, self, *args,**kwargs): try: return fn(self, *args, **kwargs) except ModelException, e: errors = str(e) params = request.POST is_unicode_params = isinstance(params, UnicodeMultiDict) params = params.mixed() request.environ['pylons.routes_dict']['action'] = form response = self._dispatch_call() # XXX: Legacy WSGIResponse support legacy_response = False if hasattr(response, 'content'): form_content = ''.join(response.content) legacy_response = True else: form_content = response response = self._py_object.response # If the form_content is an exception response, return it if hasattr(form_content, '_exception'): return form_content form_content = htmlfill.render(form_content, defaults=params, errors=errors) if legacy_response: # Let the Controller merge the legacy response response.content = form_content return response else: return form_content return decorator(wrapper) class HelloFormSchema(Schema): allow_extra_fields = True filter_extra_fields = True name = formencode.validators.UnicodeString(not_empty=True) email = formencode.validators.UnicodeString(not_empty=True) class HelloController(BaseController): def new(self): return render('/hello/new.html') def view(self): return 'created' @handle_exceptions(form='new') @validate(schema=HelloFormSchema(), form='new') @restrict("POST") def create(self): #here is code interacting with model which potentially could raise exception: if self.form_result['name'] == 'doe': raise ModelException('user already exists!') return redirect(url(controller='hello', action='view')) 

    new.html:

     ${h.form(h.url(controller='hello', action='create'), 'post')} 
    Name
    ${h.text('name')}
    Email
    ${h.text('email')}
    ${h.submit('create', 'Create')}
    ${h.end_form()}