Django - 捕获异常

时间:2012-06-05 01:07:54

标签: python django exception-handling

这可能是一个Python新手问题......

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

即使DEBUG = True,我也不希望这个raise Exception给我那个黄页。我实际上想通过将用户重定向到错误页面来处理异常或显示错误(在页面顶部给出一条CSS错误消息......)

我该如何处理?有人可以指导我吗?如果我只是提高它,我将获得黄色调试页面(再次,我不希望某些例外通过在DEBUG = True时显示调试页面来阻止网站运行。)

如何在views.py中处理这些异常?

感谢。

4 个答案:

答案 0 :(得分:20)

这里有三个选项。

  1. 提供404 handler or 500 handler
  2. 在代码中的其他位置捕获异常并执行适当的重定向
  3. 提供process_exception已实施
  4. 的自定义中间件

    中间件示例:

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

答案 1 :(得分: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

答案 2 :(得分:1)

如果您也想获得正确的回溯和消息。然后,我建议使用自定义的中间件,并将其添加到最后的settings.py中间件部分。

以下代码仅在生产中将处理异常。您可以根据需要删除调试条件。

Artist,Title
ErrorUndefined,DoesNotExist
Taylor Swift,Blank Space
Bon Jovi,It's My Life

答案 3 :(得分:0)

另一个建议可能是使用Django messaging framework来显示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 %}