2012-06-05 7 views
7

potrebbe essere una domanda Python newbie ...Django - eccezione cattura

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

Anche con DEBUG = True, non voglio questo raise Exception mi dà quella pagina gialla. In realtà voglio gestire l'eccezione reindirizzando gli utenti a una pagina di errore o mostra l'errore (dare un messaggio di errore CSS nella parte superiore della pagina ...)

Come gestirlo? Qualcuno può guidarmi? Se lo sollevo, otterrò una pagina di debug gialla (di nuovo, non voglio che certe eccezioni impediscano il funzionamento del sito mostrando la pagina di debug quando DEBUG = True).

Come gestisco queste eccezioni in views.py?

Grazie.

+2

Inizio non sollevando una ... –

+0

@ IgnacioVazquez-Abrams Grazie. Ma come si ottiene l'errore ValidationError di Django? Non sollevano eccezioni. Passano semplicemente l'eccezione come stringa alle viste. – user423455

+0

@ user423455 catturano l'eccezione all'interno del modulo e lo gestiscono in modo appropriato. –

risposta

19

Avete tre opzioni qui.

  1. Fornire una cattura 404 handler or 500 handler
  2. eccezione altrove nel codice e fare adeguata reindirizzamento
  3. Fornire middleware personalizzato con il process_exception implementato

Middleware Esempio:

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

Grazie. Questo è un ottimo punto di partenza. Guarderò la documentazione. – user423455

+0

@ user423455 Dovresti fare clic su accetta su questa risposta se pensi che risponda alla tua domanda. – Maccesch

+0

Grazie Josh! – user423455

4

È possibile aumentare un errore 404 o semplicemente reindirizzare utente sulla vostra pagina di errore personalizzata con messaggio di errore

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

Grazie. Un altro ottimo punto di partenza. Passerò i prossimi giorni a provare. Grazie! – user423455

0

altro suggerimento potrebbe essere quello di utilizzare Django messaging framework per visualizzare messaggi flash, invece di una pagina di errore.

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) 

E poi nella vista, come nella documentazione Django:

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