java自定义异常

2023-09-19 21:18:33

 首先跟前端商量好,用errMessage作为异常信息传输的关键字。

 1. 创建一个公共异常类

如果要获取 "非法参数" 的错误消息,可以使用 CommonError.PARAMS_ERROR.getErrMessage() 方法来获取。这种方式使得代码更具可读性和维护性。

public enum CommonError {
//Java 的枚举类型(Enum)用于表示一组具有固定值的常量。枚举类型提供了一种更安全、更可读且更易维护的方式来处理一组相关的常量。
//    下面的常量通过CommonError( String errMessage)方法,将错误信息传递给私有成员变量private
    UNKOWN_ERROR("执行过程异常,请重试。"),
    PARAMS_ERROR("非法参数"),
    OBJECT_NULL("对象为空"),
    QUERY_NULL("查询结果为空"),
    REQUEST_NULL("请求参数为空");

// 这一行定义了一个私有的成员变量 errMessage,用于存储枚举常量的错误消息。
    private String errMessage;

    /**返回对应的错误参数信息如:
     * String errorMessage = CommonError.PARAMS_ERROR.getErrMessage();
     * System.out.println(errorMessage); // 输出 "非法参数"
     * 用于获取枚举常量的错误消息。这个方法允许你通过枚举常量来获取相应的错误消息。
     */
    public String getErrMessage() {
        return errMessage;
    }

// 这是枚举的构造函数,它在创建每个枚举常量时被调用,并用传递的错误消息来初始化 errMessage 成员变量。
    private CommonError( String errMessage) {
        this.errMessage = errMessage;
    }

}

2.创建一个返回给前端的RestErrorResponse对象

/*
通常情况下,当发生错误时,你可以创建一个 RestErrorResponse 对象,
将错误消息传递给构造函数,然后将这个对象作为响应的一部分返回给客户端,以便客户端能够获取错误信息。
*/
//它实现了 Serializable 接口,表示这个类可以序列化,通常用于对象的持久化和网络传输。
public class RestErrorResponse implements Serializable {

    //这是一个私有成员变量 errMessage,用于存储错误消息。
    private String errMessage;

    //这是类的构造函数,它接受一个错误消息字符串作为参数,并用它来初始化 errMessage 成员变量。
    public RestErrorResponse(String errMessage){
        this.errMessage= errMessage;
    }

    //这是一个公共方法 getErrMessage(),用于获取错误消息的值。通常,这种方法被用来从对象中获取属性的值。
    public String getErrMessage() {
        return errMessage;
    }

    //用于设置错误消息的值。通常,这种方法被用来修改对象的属性值。
    public void setErrMessage(String errMessage) {
        this.errMessage = errMessage;
    }
}

3.自定义运行时异常

public class XueChengPlusException extends RuntimeException {

    //这是一个私有成员变量 errMessage,用于存储异常的错误消息。
    private String errMessage;

    //这是无参构造函数,它调用父类 RuntimeException 的无参构造函数。
    public XueChengPlusException() {
        super();
    }

    /*这是有参构造函数,它接受一个错误消息字符串作为参数。它首先调用父类 RuntimeException 的构造函数,
     并传递错误消息,然后将错误消息存储到 errMessage 成员变量中。
     */
    public XueChengPlusException(String errMessage) {
        super(errMessage);
        this.errMessage = errMessage;
    }

    //这是一个公共方法 getErrMessage(),用于获取异常的错误消息。
    public String getErrMessage() {
        return errMessage;
    }

    /*
    这是一个静态方法 cast(),它接受一个 CommonError 枚举常量作为参数。它抛出一个 XueChengPlusException 异常,
    异常的错误消息来自于传入的 CommonError 枚举常量的错误消息。
     */
    public static void cast(CommonError commonError){
        throw new XueChengPlusException(commonError.getErrMessage());
    }
    /*
    是另一个静态方法 cast(),它接受一个字符串作为参数。
    它也抛出一个 XueChengPlusException 异常,异常的错误消息来自于传入的字符串。
    */
    public static void cast(String errMessage){
        throw new XueChengPlusException(errMessage);
    }

}

4.配置全局异常处理器

//这是 Lombok 提供的注解,用于自动生成日志记录器(logger)的代码。日志记录器通常用于记录应用程序的运行时信息。
@Slf4j
// 这是 Spring Framework 提供的注解,它标识这个类是一个全局异常处理器。全局异常处理器用于捕获应用程序中抛出的异常,并根据异常类型执行相应的处理逻辑。
@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseBody
      /*
    这是一个异常处理方法的注解,它指定了要处理的异常类型为 XueChengPlusException。
    如果应用程序抛出了这种异常,将会调用这个方法来处理。
    */
    @ExceptionHandler(XueChengPlusException.class)
    /*
     注解用于标识异常处理方法所处理的异常类型,并且可以指定返回的 HTTP 状态码以及可选的原因(reason)。
     HttpStatus.INTERNAL_SERVER_ERROR是一个枚举值,表示 HTTP 响应状态码为 500 Internal Server Error(内部服务器错误)。
     这个状态码通常用于表示服务器在处理请求时发生了未知的、不可预料的错误。表示会返回500状态码
    */
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse customException(XueChengPlusException e) {

        log.error("【系统异常】{}",e.getErrMessage(),e);
        return new RestErrorResponse(e.getErrMessage());

    }

    @ResponseBody
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse exception(Exception e) {

        log.error("【系统异常】{}",e.getMessage(),e);

        return new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrMessage());

    }

    @ResponseBody
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse methodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<String> msgList = new ArrayList<>();
        //将错误信息放在msgList
        bindingResult.getFieldErrors().stream().forEach(item->msgList.add(item.getDefaultMessage()));
        //拼接错误信息
        String msg = StringUtils.join(msgList, ",");
        log.error("【系统异常】{}",msg);
        return new RestErrorResponse(msg);
    }

}

5.异常示例

        //向课程信息表插入数据新增对象
        CourseBase courseBaseNew = new CourseBase();
        //将填写的课程信息赋值给新增对象,属性一致就可以拷
        BeanUtils.copyProperties(dto, courseBaseNew);
        //设置审核状态
        courseBaseNew.setAuditStatus("202002");
        //设置发布状态
        courseBaseNew.setStatus("203001");
        //机构id
        courseBaseNew.setCompanyId(companyId);
        //添加时间
        courseBaseNew.setCreateDate(LocalDateTime.now());
        //插入课程基本信息表
        int insert = courseBaseMapper.insert(courseBaseNew);
        if (insert <= 0) {
            throw new XueChengPlusException("新增课程基本信息失败");
        }

更多推荐

高防CDN如何保护电商平台的在线支付系统安全

高防CDN如何保护电商平台的在线支付系统安全?随着移动互联网的快速发展,越来越多的用户选择在手机上进行购物和支付。这种形式的便利性和灵活性推动了电商平台的发展,但同时也给电商平台的安全带来了新的挑战。尤其是在线支付系统,由于其涉及用户的金融信息,成为黑客攻击的重点目标。为了保护电商平台的在线支付系统安全,选择合适的高防

案例实践丨基于SkyWalking全链路监控的微服务系统性能调优实践篇

1背景随着开源社区和云计算的快速推进,云原生微服务作为新型应用系统的核心架构,得到了越来越广泛的应用。根据Gartner对微服务的定义:“微服务是范围狭窄、封装紧密、松散耦合、可独立部署且可独立伸缩的应用程序组件。”微服务之父,马丁.福勒,对微服务概述如下:就目前而言,对于微服务业界并没有一个统一的、标准的定义。但通常

Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

Unity开发人员的城堡游戏引擎概述一、简介2.Unity相当于什么GameObject?3.如何设计一个由多种资产、生物等组成的关卡?4.在哪里放置特定角色的代码(例如生物、物品)?Unity中“向GameObject添加MonoBehaviour”相当于什么?5.Unity子目录相当于什么Assets?6.支持哪些

git基本使用

一、Git简介Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。Git易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和ClearCase等版本控制工具。1.版本控制的三个阶段版本控制

深度解析Java虚拟机(JVM)的垃圾回收机制

AI绘画关于SD,MJ,GPT,SDXL百科全书面试题分享点我直达2023Python面试题2023最新面试合集链接2023大厂面试题PDF面试题PDF版本java、python面试题项目实战:AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、A

浅谈大数据背景下用户侧用电数据在电力系统的应用与发展分析

安科瑞华楠摘要:随着能源互联网、互联网+、新型传感技术的持续推进,电力用户侧用电数据呈现指数级剧增、异构性增强的情况,逐渐构成了用户侧用电行为大数据。然而目前对电力领域的数据价值挖掘于电网内部和电源端,用户侧庞大且蕴含丰富价值的电力数据而未能得到很好利用。文章主要是在用户侧用电行为大数据的基础上,对用户侧电力数据价值在

机器学习(16)---聚类(KMeans)

聚类一、聚类概述1.1无监督学习与聚类算法1.2sklearn中的聚类算法二、KMeans2.1基本原理2.2簇内误差平方和三、sklearn中的KMeans3.1所用模块3.2聚类算法的模型评估指标3.3轮廓系数3.4CHI(卡林斯基-哈拉巴斯指数)四、KMeans做矢量量化4.1概述4.2案例一、聚类概述1.1无监

负载均衡算法介绍及应用连接池负载不均问题分析

在分布式系统架构下,为了满足高并发和高扩展性的要求,负载均衡设备得以广泛的使用。结合应用连接池的配置,在实际使用过程中可能会出现负载不均的问题。本文简单介绍了负载均衡算法、Druid连接池配置以及连接池负载不均的问题分析及优化方法。1、负载均衡基本概念1.1负载均衡介绍在分布式架构下随着逻辑业务的快速发展,系统架构也随

元宇宙安全与著作权相关市场与技术动态:韩国视角

元宇宙市场动态元宇宙安全与著作权维护技术现状元宇宙有可能为商业创造巨大价值,尤其是在零售和时尚领域。时尚产品的象征性价值不仅在物理空间中得以保持,在虚拟空间中也是如此。通过元宇宙平台,企业可以开发虚拟产品,降低供应链和库存管理的风险。随着虚拟化和触觉技术的发展,消费者可以通过体验产品的物理特性做出更好的购买决策。通过将

go 1.18新特性(泛性 模糊测试 WorkSpace)

文章目录泛型interface的功能扩展泛型使用模糊测试模糊测试的使用模糊测试的缺点GoWorkSpace泛型interface的功能扩展在1.18之前,官方对interface的定义是方法的集合,可以存储实现该方法的任意类型。1.18对interface的定义改为类型集合。接口类型的变量可以存储这个接口类型集合的任意

go-channel

设计原理Go提及的设计模式就是:不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。共享内存方式:多个协程共享同一块内存,但是多个协程中读写变量是操作同一块内存,会产生多线程问题的并发问题,所以需要使用互斥锁来实现临界区的互斥访问,会大大影响效率通信方式(go语言使用):channel通道当做通信的中间件队

热文推荐