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抛出的异常也能返回具体的错误信息了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构