DRF之全局异常处理
全局异常处理
在使用DRF时,有许多我们自己编写的类中都有用到raise去抛出异常,但是程序并不会停止,也不会报错,而是返回信息,这是因为DRF有一个全局异常处理的方法,它配置在DRF的配置文件中:
from rest_framework import settings
异常处理函数位置:
from rest_framework.views import exception_handler
DRF抛异常会返回具体错误信息
原生Django抛异常会返回一堆信息
执行流程
一、APIView类的dispatch执行时抛出异常,执行handle_exception
二、调用exception_handler函数,并传入2个参数
# context内容
context = {
'view': 当前视图类对象,
'args': 视图函数带的位置参数,
'kwargs': 视图函数带的关键字参数,
'request': 请求对象
}
三、处理异常,并返回信息
自定义异常处理函数
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抛出的异常也能返回具体的错误信息了