DRF之全局异常处理

全局异常处理

在使用DRF时,有许多我们自己编写的类中都有用到raise去抛出异常,但是程序并不会停止,也不会报错,而是返回信息,这是因为DRF有一个全局异常处理的方法,它配置在DRF的配置文件中:

from rest_framework import settings

image

异常处理函数位置:

from rest_framework.views import exception_handler

DRF抛异常会返回具体错误信息

image

原生Django抛异常会返回一堆信息

image

执行流程

一、APIView类的dispatch执行时抛出异常,执行handle_exception

image

二、调用exception_handler函数,并传入2个参数

# context内容
context = {
    'view': 当前视图类对象,
    'args': 视图函数带的位置参数,
    'kwargs': 视图函数带的关键字参数,
    'request': 请求对象
}

image

三、处理异常,并返回信息

image

自定义异常处理函数

DRF提供的异常处理函数只能处理DRF中的异常,无法处理原生Django抛出的异常,我们可以自定义一个异常处理函数来解决。

第一步:自定义函数:

from rest_framework.views import exception_handler
from rest_framework.response import Response
def my_exception_handler(exc, context):
    # 借用全局异常处理函数
    response = exception_handler(exc, context)
    # 判断是否有值,有值代表是DRF的异常,没值就是原生Django的异常
    if response:
        msg = response.data.get('detail')
    else:
        msg = str(exc)
    return Response(msg)

第二步:配置文件添加:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER':'my_exception_handler函数路径'
}

然后原生Django抛出的异常也能返回具体的错误信息了

image

posted @ 2022-06-22 15:45  Yume_Minami  阅读(298)  评论(0编辑  收藏  举报