springboot实现全局异常处理及自定义异常类

一、背景简介

在SpringBoot的应用开发过程中,异常处理显得尤为关键。当系统运行出现意外情况时,能够及时捕获异常、快速定位问题和提供友好的提示信息,是系统健壮性和用户体验的保障。本文将介绍如何使用SpringBoot实现全局异常处理并自定义异常类,帮助开发人员快速高效地处理异常信息。

二、目标

实现全局异常处理,处理系统的所有异常,包括运行时异常和非运行时异常,并且能够自定义异常类,将不同类型的异常进行归类。

三、实现步骤

  1. 创建自定义异常类
public class MyException extends RuntimeException {

    private Integer code;
    private String message;

    public MyException(ResultCodeEnum resultCodeEnum) {
        this.code = resultCodeEnum.getCode();
        this.message = resultCodeEnum.getMessage();
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
  1. 创建全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result handleException(Exception e) {
        if (e instanceof MyException) {
            MyException myException = (MyException) e;
            return Result.fail(myException.getCode(), myException.getMessage());
        }
        return Result.fail(ResultCodeEnum.SYSTEM_ERROR.getCode(), ResultCodeEnum.SYSTEM_ERROR.getMessage());
    }
}
  1. 配置自定义异常类
@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/test")
    public Result test() {
        throw new MyException(ResultCodeEnum.PARAM_ERROR);
    }
}

四、效果演示

在访问 /api/test 接口时,会抛出 MyException 异常,然后由全局异常处理类捕获异常并处理,最终返回如下JSON格式的响应体:

{
  "code": 400,
  "message": "参数错误"
}

五、进阶拓展

除了自定义异常类、全局异常处理类以外,我们也可以在异常处理类中添加更多的异常处理方法,处理不同类型的异常。例如,我们可以添加一个 NullPointException 的处理方法:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result handleException(Exception e) {
        if (e instanceof MyException) {
            MyException myException = (MyException) e;
            return Result.fail(myException.getCode(), myException.getMessage());
        }
        return Result.fail(ResultCodeEnum.SYSTEM_ERROR.getCode(), ResultCodeEnum.SYSTEM_ERROR.getMessage());
    }

    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public Result handleNullPointerException(NullPointerException e) {
        return Result.fail(ResultCodeEnum.NULL_POINTER_ERROR.getCode(), ResultCodeEnum.NULL_POINTER_ERROR.getMessage());
    }
}

这样,当系统出现 NullPointerException 异常时,全局异常处理类会自动捕获异常并调用对应的处理方法进行处理。

六、实战示例

以下是一个基于SpringBoot实现全局异常处理及自定义异常类的示例项目:

https://github.com/linlinjava/litemall/blob/master/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java

https://github.com/linlinjava/litemall/blob/master/litemall-core/src/main/java/org/linlinjava/litemall/core/exception/GlobalExceptionAdvice.java

七、总结

本文介绍了使用SpringBoot实现全局异常处理及自定义异常类的攻略,其中包含了详细的步骤和示例,并对如何进一步拓展进行了说明。异常处理虽然看似简单,但实际上却是系统开发中非常重要的一环。希望本文能够帮助读者更好地掌握异常处理的相关知识。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot实现全局异常处理及自定义异常类 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • java使用dbcp2数据库连接池

    使用dbcp2数据库连接池可以有效地提升Java应用程序与数据库的交互效率。下面是Java使用dbcp2数据库连接池的完整攻略。 步骤一:引入dbcp2依赖 在Java程序中使用dbcp2数据库连接池,需要通过引入dbcp2依赖来实现。可以通过Maven等依赖管理工具,在项目中添加以下依赖: <dependency> <groupId&gt…

    Java 2023年5月19日
    00
  • Java BigDecimal基础用法详解

    Java BigDecimal基础用法详解 什么是BigDecimal Java中的float和double类型是不能精确表示十进制数的,这对于很多需要精确计算的场景是不适用的。而BigDecimal是Java提供的一个可以精确表示任意大小和精度的十进制数类。 常用构造方法 BigDecimal(double val):通过一个Double类型的值来构造Bi…

    Java 2023年5月26日
    00
  • Mybatis Plus使用XML编写动态sql的超简易方法

    下面详细讲解”Mybatis Plus使用XML编写动态SQL的超简易方法”。 简介 Mybatis Plus是Mybatis的增强工具,可以用来简化Mybatis的开发。Mybatis Plus默认使用了entity的字段映射表中的字段,但是在实际开发过程中,我们经常会遇到重用entity映射表中同一个字段做不同的条件查询的情况,这时候我们就需要用XML来…

    Java 2023年5月20日
    00
  • Java基础知识之Java语言概述

    Java基础知识之Java语言概述 Java语言是一门面向对象的编程语言,由Sun公司开发,后被Oracle公司收购。Java的特点表现在以下三个方面: 简单性 Java摒弃了C++的多重继承、指针、运算符重载等复杂的特性,使得Java更为简单易懂,因此Java语言入门难度较低。 面向对象 Java强调抽象和封装,支持继承和多态等特性,具有良好的扩展性和复用…

    Java 2023年5月23日
    00
  • java实现二分法的完整代码

    要实现二分法,需要定义一个函数,函数需要传入三个参数:要查找的数组、要查找的数和数组范围的起点和终点。 下面是标准的Java实现二分法的完整代码示例: public static int binarySearch(int[] nums, int target, int left, int right) { while (left <= right) {…

    Java 2023年5月19日
    00
  • Java中Date与String相互转换的方法

    让我来详细讲解一下“Java中Date与String相互转换的方法”的攻略。 为什么需要进行Date与String的转换 在 Java 中,Date 类表示日期和时间。而在进行实际编程的过程中,我们常常需要将日期时间转换为字符串,或者将字符串转换为日期时间。因此,掌握 Date 和 String 相互转换的方法是非常重要的。 Date 转换为 String …

    Java 2023年5月27日
    00
  • 利用iText在JSP中生成PDF报表

    生成PDF报表可以利用Java中的iText库来实现,iText使用方便,具有灵活性和可定制性,支持多语言,功能强大,可以创建、读取和操作PDF文档、表单和模板,生成安全性高的PDF文档。 以下是在JSP中使用iText生成PDF报表的完整攻略: 步骤1:下载iText库 在iText官网(https://itextpdf.com/)下载最新版的iText库…

    Java 2023年6月15日
    00
  • Java数据结构之选择排序算法的实现与优化

    Java数据结构之选择排序算法的实现与优化 选择排序算法的原理 选择排序是一种简单直观的排序算法,它的基本思想是:从待排序的数据中选出最小的数,将其放在首位;再从剩余的数据中选出最小的数,放在已排序数据的末尾;以此类推,直到所有数据均已排序完毕。 选择排序的时间复杂度为O(n²),空间复杂度为O(1)。相比于其他排序算法,选择排序的代码实现简单、易于理解。 …

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部