2012-06-05 21 views
7

Podría ser una pregunta novato Python ...Django - a excepción de captura

try: 
    #do something 
except: 
    raise Exception('XYZ has gone wrong...') 

Incluso con debug = true, no desea que esta raise Exception me da esa página amarilla. De hecho, quiero manejar la excepción al redirigir a los usuarios a una página de error o mostrar el error (dar un mensaje de error CSS en la parte superior de la página ...)

¿Cómo manejo eso? ¿Puede alguien guiarme? Si simplemente me levanto, voy a conseguir de páginas amarillas de depuración (de nuevo, no quiero ciertas excepciones para detener el sitio de funcionamiento, mostrando la página de depuración cuando debug = true).

¿Cómo manejo estas excepciones en views.py?

Gracias.

+2

de inicio al no subir uno ... –

+0

@ IgnacioVazquez-Abrams Gracias. ¿Pero cómo lo logra ValidationError de Django? No plantean excepción. Simplemente pasan la excepción como cadena a las vistas. – user423455

+0

@ user423455 que capta la excepción dentro de la forma y manejar de manera apropiada. –

Respuesta

19

Usted tiene tres opciones aquí.

  1. Proporcionar un Catch 404 handler or 500 handler
  2. la excepción en otras partes de su código y hacer redirección adecuada
  3. Proporcionar middleware personalizado con el process_exception implementado

Middleware Ejemplo:

class MyExceptionMiddleware(object): 
    def process_exception(self, request, exception): 
     if not isinstance(exception, SomeExceptionType): 
      return None 
     return HttpResponse('some message') 
+0

Gracias. Este es un gran punto de partida. Veré la documentación. – user423455

+0

@ user423455 Debe hacer clic en aceptar en esta respuesta si cree que responde a su pregunta. – Maccesch

+0

¡Gracias, Josh! – user423455

4

Puede elevar un error 404 o simplemente redirigir usuario a su página de error con el mensaje de error

from django.http import Http404 
#... 
def your_view(request) 
    #... 
    try: 
     #... do something 
    except: 
     raise Http404 
     #or 
     return redirect('your-custom-error-view-name', error='error messsage') 
  1. Django 404 error
  2. Django redirect
+0

Gracias. Otro gran punto de partida. Pasaré los próximos días probando. ¡Gracias! – user423455

0

Otro la sugerencia podría ser usar Django messaging framework para mostrar mensajes flash, en lugar de una página de error.

from django.contrib import messages 
#... 
def another_view(request): 
    #... 
    context = {'foo': 'bar'} 
    try: 
     #... some stuff here 
    except SomeException as e: 
     messages.add_message(request, messages.ERROR, e) 

    return render(request, 'appname/another_view.html', context) 

Y luego, en la vista que en la documentación de Django:

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
Cuestiones relacionadas