2012-06-05 17 views
7

To może być kwestia Python początkujących ...Django - catch wyjątek

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

Nawet DEBUG = True, nie chcę tego raise Exception daje mi, że żółte strony. Naprawdę chcę obsłużyć wyjątek przekierowując użytkowników do strony błędu lub pokazuje błąd (podaj komunikat o błędzie CSS na górze strony ...)

Jak sobie z tym poradzić? Czy ktoś może mnie prowadzić? Jeśli po prostu go podniosę, otrzymam żółtą stronę debugowania (ponownie, nie chcę pewnych wyjątków, aby zatrzymać działanie strony, pokazując stronę debugowania, gdy DEBUG = True).

Jak obsługiwać te wyjątki w views.py?

Dzięki.

+2

zacząć od nie podnosząc jedną ... –

+0

@ IgnacioVazquez-Abrams Dzięki. Ale jak osiąga to Django w postaci ValidationError? Nie powodują wyjątków. Po prostu przekazują wyjątek jako ciąg do widoków. – user423455

+0

@ user423455 wychwytują wyjątek w formularzu i obsługują go odpowiednio. –

Odpowiedz

19

Masz trzy opcje tutaj.

  1. Podaj 404 handler or 500 handler
  2. złapać wyjątek gdzie indziej w kodzie i zrobić odpowiednie przekierowanie
  3. Podaj niestandardowe middleware z process_exception realizowane

Middleware Przykład:

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

Dzięki. To świetny punkt wyjścia. Spojrzę na dokumentację. – user423455

+0

@ user423455 Powinieneś kliknąć w tej odpowiedzi, jeśli uważasz, że odpowiada na twoje pytanie. – Maccesch

+0

Dziękuję Josh! – user423455

4

Można podnieść błąd 404 lub po prostu przekierować użytkownika na swoją stronę błędu niestandardowego z komunikatem o błędzie

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

Dzięki. Kolejny świetny punkt wyjścia. Spędzę następne kilka dni na wypróbowaniu. Dzięki! – user423455

0

Another sugestią może być użycie Django messaging framework, aby wyświetlić wiadomości flash zamiast strony błędu.

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) 

A potem w widoku jak w dokumentacji Django:

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
Powiązane problemy