全局异常处理

【一】前言

# 1 集成了APIView及子类的视图类
    -在执行:三大认证
    -在执行:过滤
    -在执行:分页
    -在执行:视图类的方法
    过程中,只要出了异常,都会被异常捕获,统一执行一个【函数】exception_handler
​
from rest_framework.response import Response
​
​
def common_exception_handler(exc, context):
    print(exc)
    print(context)
    
    l = [1, 2, 3]
    print(l[6])
    # python程序异常
    raise Exception("出错了")
    # django的异常
    return Response({'code': '303', 'msg': '服务器异常'})
异常:3大类:
        # 1 drf的异常:APIException,ValidationError,AuthenticationFailed-->默认exception_handler会处理,前端捕获抛错了
        # 2 django的异常:exception_handler不会处理,前端会抛出错误
        # 3 python程序的异常:主动抛raise,除以0,列表越界,exception_handler不会处理,前端会抛出错误
  • 我们要做的就是统一自己写一个函数来处理这三种异常

# settings.py
    1 写个方法
    2 配置在配置文件中
    3 有在再出了异常,就会走自己写的 函数
 
        # 自定义异常函数的目的就是
        # 1 统一返回格式
        # 2 返回自己定制的日志记录
        REST_FRAMEWORK={
            'EXCEPTION_HANDLER': 'app01.exceptions.common_exception_handler',
        }
import time
​
from rest_framework.views import exception_handler
from rest_framework.response import Response
​
​
def common_exception_handler(exc, context):
    request = context.get('request')
    view = context.get('view')
    print(
        f'报错时间:{time.time()},用户:{request.user.username or "匿名用户"},访问地址:{request.get_full_path()},请求方式:{request.method},视图类:{str(view)}')
​
    response = exception_handler(exc, context)
    # 有值,说明是drf的异常
    if response:
        if isinstance(response.data, dict):
            msg = response.data.get("detail") or "未知错误"
        elif isinstance(response.data, list):
            msg = response.data[0]
        return Response({'code': 303, 'msg': f'drf异常,异常信息:{msg}'})
    else:
        return Response({'code': 304, 'msg': f'程序异常,异常信息:{str(exc)}'})
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值