如何处理Django视图中的异常?

时间:2015-02-17 09:16:10

标签: django django-views

我有以下视图(使用Django REST框架):

class MyDataView(APIView):

    def post(self, request, format=None):
        my_data = MyData()
        try:
            result = my_data.save(request.data)
        except:
            exception_type, exception_value = sys.exc_info()[0:2]
            error = exception_type.__name__ + ': ' + str(exception_value)
            return Response(str(error), status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(result, status=status.HTTP_201_CREATED)

一般情况下,我知道使用常规异常处理程序是不好的做法,除非它在顶级代码中(为用户提供格式错误)。
在这种情况下,返回带有错误有效负载的400可以从用户端获得有关错误的更多信息。 我在这里考虑的另一个选择是删除try / except块,以便成功返回201,错误时返回500.

在这种情况下,最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

您还应该说明如何在生产中处理这些状态代码:即自定义400和500个消息页面?

我一直这样做:

class MyDataView(APIView):

    def post(self, request, format=None):
        my_data = MyData()
        try:
            result = my_data.save(request.data)
        except DatabaseError as dberr:
            # here you can check the type, etc of the error
            messages.error(request, "Database Error ...blah blah %s" % str(dberr))
            return redirect('/') #
        else:
            return Response(result, status=status.HTTP_201_CREATED)

然后使用基本模板中的消息包,以便在页面上突出显示的位置向用户显示一条好消息。

当然有100种方法可以解决这个问题。我相信试图捕捉你所知道的错误是最好的。这样,如果发生意外错误,则会抛出状态500,并且应该使用堆栈跟踪将电子邮件发送给您(如果在settings.py中正确设置),您可以解决问题。但是,如果引入了用户错误,您可以发出用户可以自己恢复的消息。

注意:

你也可以做except Exception as ex:而不是关于获取异常信息的方式。