Django自定义错误处理机制

一、继承Exception错误处理机制

使用Exception错误处理机制。继承后,在View.py里面使用raise捕获异常,需要使用 [ try: exception 自定义的异常类 :]才能正常使用,不够灵活,使用方法如下:

#####  my_exception.py  #####

# 利用继承自定义异常提示信息

classMyException(Exception):

    def__init__(self,code,error,data):

        self.code=code

        self.error=error

        self.data=data

##### view.py #####

try:

    if not 1<0:

        raiseMyException(1001,'你的说法错误','1不小于0')

except MyExceptionase:

    pass

二、使用rest_framework的错误处理机制

查询了很多资料,都需要在settiong.py添加如下配置:

REST_FRAMEWORK= {

'EXCEPTION_HANDLER':'common.restframework.xd_exceptions.custom_exception_handler',#这是使用自定制异常处理

}

并编辑自定义的异常处理函数

#####  xd_exceptions.py #####

fromrest_framework.viewsimportexception_handler

def custom_exception_handler(exc,context):

    # Call REST framework's default exception handler first,

    # to get the standard error response.

    response=exception_handler(exc,context)

    # Now add the HTTP status code to the response.

    if response is not None:

        response.data['status_code'] =response.status_code

        print(response.data)

        # response.data['message'] =response.data['detail']  #增加message这个key

        # response.data['message'] ='方法不对'  #增加message这个key

  return response


通过本人实践,其实并不用以上两步,下面进入正题。

继承rest_framework.exceptions 的 APIException 自定义异常处理机制

#####  exceptions.py #####

"""自定义异常"""

from rest_framework.exceptions import APIException

from rest_framework import status

class BaseError(APIException):

"""自定义异常基础类"""

    def__init__(self,detail=None,status_code=status.HTTP_400_BAD_REQUEST):

        self.detail=detail# 输出的错误信息,可以是字典型,也可以是字符串型

        self.status_code=status_code# 响应的状态码


class DefaultError(BaseError):

"""默认异常,自定义使用,返回状态-1,响应状态400"""

    def__init__(self,message=None,code=-1):

        detail= {'code':code,'message':message}# 继承BaseError,传给self.detail

        super(DefaultError,self).__init__(detail)

#####  view.py #####

from rest_framework.views import APIView

class Register(APIView):# 注意这里必须使用APIView,不能使用View,这里作者踩了坑

    @staticmethod

    defpost(r):

        username=r.POST.get('username')

        password=r.POST.get('password')

        db_user=UserModels.objects.filter(username=username,password=password).first()

        if not db_user:

            msg='用户名或密码错误'

            raise DefaultError()# 这里就可以直接捕获并弹出异常

        return db_user.id

你可能感兴趣的:(Django自定义错误处理机制)