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 @   Yume_Minami  阅读(301)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示