2012-06-05 3 views
7

Это может быть Python новичку вопрос ...Джанго - поймать исключение

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

Даже с DEBUG = True, я не хочу этого raise Exception дает мне, что желтой странице. Я действительно хочу обработать исключение, перенаправив пользователей на страницу с ошибкой или показывая ошибку (дать сообщение об ошибке CSS в верхней части страницы ...)

Как мне это обработать? Может ли кто-нибудь меня вести? Если я просто подниму его, я получу желтую страницу отладки (опять же, я не хочу, чтобы некоторые исключения останавливали работу сайта, показывая страницу отладки, когда DEBUG = True).

Как обрабатывать эти исключения в views.py?

Спасибо.

+2

Start, не поднимая один ... –

+0

@ IgnacioVazquez-Abrams Спасибо. Но как это делает форма Django ValidationError? Они не возбуждают исключения. Они просто передают исключение как строку в представления. – user423455

+0

@ user423455 они улавливают исключение в форме и обрабатывают ее соответствующим образом. –

ответ

19

У вас есть три варианта здесь.

  1. Обеспечить 404 handler or 500 handler
  2. поймать исключение в другом месте в коде и сделать соответствующее Перенаправление
  3. Обеспечением пользовательского межплатформенного с process_exception реализован

Middleware Пример:

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

Спасибо. Это отличная отправная точка. Я посмотрю документацию. – user423455

+0

@ user423455 Вы должны нажать на этот ответ, если считаете, что он отвечает на ваш вопрос. – Maccesch

+0

Спасибо, Джош! – user423455

4

Вы можете поднять 404 ошибку или просто перенаправить пользователя на пользовательской странице ошибки с сообщением об ошибке

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

Спасибо. Еще одна отличная отправная точка. Я проведу следующие несколько дней. Благодаря! – user423455

0

другими предложение может заключаться в использовании Django messaging framework для отображения флэш-сообщений вместо страницы с ошибкой.

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) 

А потом в представлении, как и в Джанго документации:

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
Смежные вопросы