Исключение Django-catch
это может быть вопрос новичка Python...
try:
   #do something
except:
   raise Exception('XYZ has gone wrong...')
даже с DEBUG=True, я не хочу этого raise Exception дает мне эту желтую страницу. Я действительно хочу обработать исключение, перенаправив пользователей на страницу ошибки или показав ошибку (дайте сообщение об ошибке CSS в верхней части страницы...)
Как мне справиться с этим? Кто-нибудь может меня проводить? Если я просто подниму его, я получу желтую страницу отладки (опять же, я не хочу, чтобы некоторые исключения останавливали работу сайта отображение страницы отладки при DEBUG=True).
Как обрабатывать эти исключения в views.py?
спасибо.
3 ответов
у вас есть три варианта.
- обеспечить 404 обработчик или 500 обработчик
- поймать исключение в другом месте кода и сделать соответствующее перенаправление
- предоставьте пользовательское промежуточное ПО с 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')
другое предложение может быть использование 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 %}
