Исключение Django-catch

это может быть вопрос новичка Python...

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

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

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

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

спасибо.

3 ответов


у вас есть три варианта.

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

Пример Промежуточного ПО:

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

вы можете вызвать ошибку 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
  2. Django redirect

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

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)

а затем в представлении, как в документации Django:

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