当前位置: 首页 > 编程笔记 >

Django 解决开发自定义抛出异常的问题

邢华清
2023-03-14
本文向大家介绍Django 解决开发自定义抛出异常的问题,包括了Django 解决开发自定义抛出异常的问题的使用技巧和注意事项,需要的朋友参考一下

在开发过程中,针对用户输入的不合法信息,我们应该在后端进行数据验证,并抛出相关的异常传递到前端来提示用户。

可是如何进行自定义抛出异常信息呢?通常处理方法有三种,我将依次介绍这三种方法。

第一种方法:

这种方法最为简单,只需要创建一个字典对象,通过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 自定义异常处理

1.

在settings.py中需要添加的配置

1.install app中添加 '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

自定义异常类 在主动抛出异常的时候就可以抛出一个下边类型的异常

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 # 新型错误

在视图或函数中主动抛出异常,

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 解决开发自定义抛出异常的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

  • 我是一名Java编程新手(实际上已经在学习),我对如何处理不同的消息有些怀疑。 我的目标是将这些不同的消息包含在同一个类(CustomExcpse类)中,以避免在从其他类抛出新CustomExceptions的每个方法上一遍又一遍地编写相同的字符串。 到目前为止,我编码: > 一个自定义异常类,它从异常扩展而来,具有不同的消息(在示例中只有两个,但还有更多)作为Strings包含,当然还有构造函数

  • 本文向大家介绍Java抛出异常与自定义异常类应用示例,包括了Java抛出异常与自定义异常类应用示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java抛出异常与自定义异常类。分享给大家供大家参考,具体如下: 异常处理常用方法: 常用的异常处理方法有: 一、try()catch() 语句 二、throw / throws 语句 三、自定义异常类 用途: 众所周知,当程序运行过程中,如果遇

  • 我必须使用访问者设计模式编写一个应用程序,如(https://www.baeldung.com/java-visitor-pattern),一个示例元素如下所示: vistor界面看起来像下面的代码,我可能不会更改界面代码。 在Visitor(AbstractVisitor类)的实现中,如果hashtable子befehle中还没有调用类的id,我必须抛出一个“UndefinedSubroutin

  • 抛出异常有什么意义?例如,我偶然发现: 但是当你不扔零点的时候,你也会得到一个零点?我经常看到这个,我想知道这是否是一个学习的好习惯?

  • 我正在尝试使用Spring Boot 2.1给出的验证JWT令牌内的声明。问题是Spring总是使用默认异常消息抛出异常: 即使我创建了一个扩展ClientAuthenticationException的自定义异常,我也会收到相同的异常消息。 当JWT声明验证失败时,我想修改异常消息。这是我的配置类: 这是我的JWTClaimVerifier类: 当JWT声明验证失败时,我希望我的自定义异常消息有