drf : 异常处理以及自定义异常处理

异常处理

在APIView的源码中,执行三大认证,视图类方法的时候,如果出现了异常,会被全局异常捕获。

我们想要做的事将报错信息展示为自定义的错误信息。

eg:

报错:
	{code:999,msg:服务器异常,请联系系统管理员}
成功:
	{code:100,msg:成功,data:[{},{}...]}

自定义APIException,此时我们自定义异常,那么异常捕获会优先使用自定义。

settings.py,配置文件配置之后才会使用自定义的异常捕获

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER':'app01.errors.comment_exception_handler'
}

查看from rest_framework.views import exception_handler源码。

APIException异常的状态码为500,被自定义异常捕获。

主动排除程序异常

最终想要呈现的效果:

from rest_framework.views import exception_handler
from rest_framework.response import Response

"""
在内置的settings.py 如果没有自定义使用内置的异常捕获。
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
"""
def comment_exception_handler(exc, context):
    """
    {
    'view': <app01.views.TextAPIView object at 0x7fba5bde2c18>,
    'args': (),
    'kwargs': {},
    'request': <rest_framework.request.Request: GET '/text/'>
    }
    """
    print(context)
    res = exception_handler(exc, context)
    """
    第一种情况:返回Response对象,
    这表示已经处理了异常,并且只处理APIException的异常
    """
    if res:
        res = Response(data={
            'code':998,
            'status':res.status_code,
            'msg':res.data.get('detail','服务器异常,联系系统管理员')
        })
    else:
        return Response({'code': 999, 'msg': str(exc)})
    request = context.get('request')
    view = context.get('view')
    print(f'错误原因: {str(request)}',f'错误视图类: {str(view)}',f'请求方式:{str(request.method)}',f'请求路径:{request.path}')
    return res

输出:

错误原因: <rest_framework.request.Request: GET '/text/'> 错误视图类: <app01.views.TextAPIView object at 0x7fedde3cdb38> 请求地址:GET 请求路径:/text/
posted @ 2022-04-11 15:34  谢俊杰  阅读(199)  评论(0编辑  收藏  举报