drf之全局异常处理

发布时间 2023-05-05 16:45:35作者: 树苗叶子

说明

当系统报错时,希望系统进行统一报告,比如常见的:系统繁忙,请稍后再试、服务异常,请稍后再试这种报错。
另外,drf不能处理非drf的异常,比如 list = [1, 2, 3] print(l[5]),这种时候会报错,不会抛异常,有时候我们不希望程序报错,也需要使用全局异常处理。

使用方法

在django项目中添加如下配置(默认配置在drf的settings.py中,我的目录是:Lib/site-packages/rest_framework/settings.py):

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': '自己写的错误类',
}

自定义错误类

  1. 我在项目中创建了exceptions.py文件
  2. 在exceptions.py文件中定义,可以参考drf默认配置(Lib/site-packages/rest_framework/views.py中的exception_handler函数)
from rest_framework.views import exception_handler
from rest_framework.response import Response


def my_exception_handler(exc, context):
    res = exception_handler(exc, context)
    # exc就是错误对象
    # 正常走了这个函数,系统就报错了,这时就应该记录日志,需要把exc记录到系统中
    # 记录日志的信息应该有:'时间', '登录用户id', '用户ip', '请求方式', '请求地址', '执行视图的类', '错误原因'
    if res:
        res = Response(data={'code': 10001, 'msg': res.data.get('detail', '系统异常,请联系系统管理员')})
    else:
        res = Response(data={'code': 10002, 'msg': '系统异常,请联系系统管理员'})
    return res