今天爱分享给大家带来python 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