欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DRF(十三):处理全局异常

程序员文章站 2022-07-12 11:02:21
...

自定义全局异常

DRF默认的异常处理,只处理APIException及其子类的异常,处理不了的会返回None,我们可以判断异常是否属于APIException及其子类的异常,如果是则返回错误信息,如果不是,那么我们则返回服务器错误。

# 默认的异常处理,缺陷在它只处理APIException及其子类的异常,处理不了的会返回None
from rest_framework.views import exception_handler

from rest_framework.response import Response


def common_exception_handler(exc, context):

    ### 记录日志,目前先打印
    user_id = context['request'].user.id
    print('视图类:%s 出错了,是IP地址为%s的用户访问,用户id为:%s,错误原因是%s'
          % (
              str(context['view']),
              context['request'].META.get('REMOTE_ADDR'),
              user_id,
              str(exc)
          ))
    # 处理异常,统一返回格式
    response = exception_handler(exc, context)

    if response:  # 有值
        return Response(data={'code': 9998, 'msg': response.data})
    else:  # 没有值
        # exc对象,就是错误对象,把错误信息要记录日志
        return Response(data={'code': 9999, 'msg': '服务器异常,请联系系统管理员'})
    
# 2 在配置文件中配置
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.exceptions.common_exception_handler', 
}

exc中是错误原因,context中包括视图类和请求数据

# 打印exc得到错误原因
list index out of range 
# 打印context得到
view是视图类,request请求信息,里面可以得到用户id和ip地址
{'view': <app01.views.IndexView object at 0x0000022B36C91610>, 'args': (), 'kwargs': {}, 'request': <rest_framework.request.Request: GET '/'>}

处理全局异常格式:

#1  定义一个函数
def common_exception_handler(exc, context):
    # 加入日志的逻辑
    response = exception_handler(exc, context)
    if response:
        return Response(data={'code': 9998, 'msg': response.data})
    else:
        return Response(data={'code': 9999, 'msg': '服务器异常,请联系系统管理员'})
    
 # 2 在配置文件中配置
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.exceptions.common_exception_handler', 
}