Django开发中自定义异常处理的三种常用方法及DRF集成指南

远山来客
远山来客
发布时间:2026-10-13| 4人浏览过
原创

本文详细介绍Django后端开发中处理非法用户输入的三种自定义异常抛出方式。包括通过字典对象传递错误信息、继承Exception类创建自定义异常以及基于object类的轻量级实现。此外,文章还补充了Django REST framework中通过配置EXCEPTION_HANDLER实现全局自定义异常捕获与友好返回的完整流程,涵盖settings配置、异常类定义及视图中的主动抛出示例。

Django自定义异常处理的三种基础方法

在Web应用开发过程中,当接收到用户提交的非法数据时,后端应当执行严格的数据验证逻辑,并将相应的错误信息以异常形式抛出,以便前端能够获取并展示给用户。

那么,具体该如何实现自定义异常的抛出呢?通常有三种主流处理方法,本文将逐一进行解析。

第一种实现方式:

该方式最为简便,核心思路是构建一个包含错误信息的字典对象,并通过render函数将其传递给前端模板进行渲染展示。

具体的字典对象结构如下:

result = {'code':'', 'message':''} render(request, 'xxx.html', result:result)

第二种实现方式:

此方法需要定义一个继承自Exception类的自定义异常类,具体代码实现如下:


# 利用继承自定义异常提示信息
class MyException(Exception):
  def __init__(self, code, error, data):
    self.code = code
    self.error = error
    self.data = data
try:
  if not 1 < 0:
    raise MyException(1001, '你的说法错误', '1不小于0')
except MyException as e:
  pass

第三种实现方式:

可以自定义一个直接继承自object的普通类,用于封装异常相关的数据。


class MyTest(object):
  def __init__(self):
    # 自定义状态码
    self.code = 1000
    self.error = ''
    self.data = ''
 
  @property
  def dict(self):
    return self.__dict__

在需要触发自定义异常的逻辑节点,实例化该类并指定具体的错误代码、提示信息及数据内容。


# 创建实例对象
one = MyTest()
one.code = 1001
one.error = '你错了'
one.data = '请再次检查'
 
print(one.dict)

综上所述,以上三种方法均为笔者在后端进行数据校验并向前端传递异常信息的常用手段。

Django REST framework全局异常处理配置

补充知识:Django REST framework (DRF) 中的自定义异常处理机制

1.

在项目的settings.py配置文件中,需要进行以下相关配置:

1.在INSTALLED_APPS中添加 'rest_framework',

2.在settings配置文件中添加全局异常处理器的配置项:

REST_FRAMEWORK = { 'EXCEPTION_HANDLER':'common.restframework.xd_exceptions.custom_exception_handler', #这是使用自定制异常处理 }

xd_exceptions.py文件用于定义具体的异常处理函数逻辑。


from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
  # Call REST framework's default exception handler first,
  # to get the standard error response.
  response = exception_handler(exc, context)

  # Now add the HTTP status code to the response.
  if response is not None:
    response.data['status_code'] = response.status_code
    print(response.data)
    # response.data['message'] =response.data['detail']  #增加message这个key
    # response.data['message'] ='方法不对'  #增加message这个key

  return response

在主动抛出异常时,可以抛出自定义的异常类实例,该类需继承自APIException。

my_errors.py文件内容如下:


from rest_framework import status
from rest_framework.exceptions import APIException
from common.tools import xd_status

# class ParseError(APIException):
#   status_code = xd_status.HTTP_400_BAD_REQUEST
#   default_detail = '这是.default_detail========'
#   default_code = 'parse_error'
#

class XdError(APIException):
  pass

class ParamError(XdError):
  status_code = 400

class Unauthorized(XdError):
  status_code = 401

class PermissionDenied(XdError):
  status_code = 403

class ObjectNotFound(XdError):
  status_code = 404

class ServerError(XdError):
  status_code = 500

class ErrorCode:
  UNAUTHORIZED = 10000 # 未登录
  PERMISSION_DENIED = 10001 # 无权限
  PARAM_ERROR = 40000 # 参数验证错误
  DATA_NOT_FOUND = 40001 # 未找到数据
  DATA_NOT_VALID = 40002 # 数据错误
  REPEAT_POST = 40003 # 重复提交
  EEEE = 40003 # 新型错误

在视图类或普通函数中,通过raise语句主动抛出上述定义的异常,


class SupserUserDetailView(APIView):
  # authentication_classes = []
  permission_classes = [SupserPermisson,]

  def put(self,request,pk):
    if not request.user.is_superuser:
      if request.user.id != pk:
        raise ParamError('用户没有修改权限', ErrorCode.EEEE)  #这就是抛出自定义异常, 然后自己的异常捕获方式就能捕获这个异常
    user = User.objects.filter(id=pk)
    if not user:
      raise ParamError('被修改的用户不存在', ErrorCode.EEEE)
    data = handel_c_user(request.data)
    user_obj = Creat_newuser_serializers(data=data, instance=user.first())

    if user_obj.is_valid():
      user_obj.save()
      res={'status':"修改成功"}

      return JsonResponse(data=res, code=200, desc="success", status=status.HTTP_200_OK)
    res = {'status':user_obj.errors}

    return JsonResponse(data=res,code=200,desc="success",status=status.HTTP_200_OK)

整体工作流程如下:

用户访问触发特定条件导致异常发生。

系统自动抛出预设的自定义异常。

自定义的异常捕获函数拦截该异常,并构造用户友好的数据格式返回给前端。

以上关于Django开发中自定义抛出异常的解决方案即为本文的全部内容,希望能为读者提供有价值的参考,也欢迎大家继续支持本站获取更多技术分享。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。