Django - catch exception

前端 未结 4 409
灰色年华
灰色年华 2021-01-11 17:32

It might be a Python newbie question...

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

Even with DEBUG=True,

相关标签:
4条回答
  • 2021-01-11 18:15

    You can raise a 404 error or simply redirect user onto your custom error page with error message

    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 讨论(0)
  • 2021-01-11 18:22

    Another suggestion could be to use Django messaging framework to display flash messages, instead of an error page.

    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)
    

    And then in the view as in Django documentation:

    {% if messages %}
    <ul class="messages">
        {% for message in messages %}
        <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
        {% endfor %}
    </ul>
    {% endif %}
    
    0 讨论(0)
  • 2021-01-11 18:24

    If you want to get proper traceback and message as well. Then I will suggest using a custom middleware and add it to the settings.py middleware section at the end.

    The following code will process the exception only in production. You may remove the DEBUG condition if you wish.

    from django.http import HttpResponse
    from django.conf import settings
    import traceback
    
    
    class ErrorHandlerMiddleware:
    
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            response = self.get_response(request)
            return response
    
        def process_exception(self, request, exception):
            if not settings.DEBUG:
                if exception:
                    message = "{url}\n{error}\n{tb}".format(
                        url=request.build_absolute_uri(),
                        error=repr(exception),
                        tb=traceback.format_exc()
                    )
                    # Do whatever with the message now
                return HttpResponse("Error processing the request.", status=500)
    
    0 讨论(0)
  • 2021-01-11 18:37

    You have three options here.

    1. Provide a 404 handler or 500 handler
    2. Catch the exception elsewhere in your code and do appropriate redirection
    3. Provide custom middleware with the process_exception implemented

    Middleware Example:

    class MyExceptionMiddleware(object):
        def process_exception(self, request, exception):
            if not isinstance(exception, SomeExceptionType):
                return None
            return HttpResponse('some message')
    
    0 讨论(0)
提交回复
热议问题