Spring Boot统一异常处理详解

下面将以“Spring Boot统一异常处理详解”为主题,为大家详细讲解该主题的完整攻略。

一、什么是 Spring Boot 统一异常处理

Spring Boot 统一异常处理指在 Spring Boot 应用程序中,通过设置全局异常处理器,来捕获和处理抛出的异常信息。通过统一异常处理,我们可以将系统中可能出现的各种异常信息进行分类、归纳和统一处理,并返回标准化的异常响应结果,从而为系统开发和运维提供了极大的便利和效率。

二、Spring Boot 统一异常处理的实现方式

一般来说,Spring Boot 实现全局异常处理有两种方式:

1.使用 @ControllerAdvice 实现

@ControllerAdvice 注解是 Spring 框架中提供的一个基于 AOP 可以被所有使用 @RequestMapping 注解的方法共享的增强控制器,它作用于全局,可以用于捕获和处理在控制器中抛出的异常信息。

第一步:定义一个增强控制器

@ControllerAdvice
public class GlobalExceptionHandler {
    // 异常处理逻辑代码
}

第二步:在 GlobalExceptionHandler 类中添加处理具体异常的方法

@ControllerAdvice
public class GlobalExceptionHandler {
    /**
    * 处理运行时异常
    */
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public CommonResult handleRuntimeException(RuntimeException e) {
        log.error("运行时异常:", e);
        return CommonResult.error("系统异常,请稍后再试!");
    }
}

第三步:测试异常处理效果

@RequestMapping("/getUser")
public CommonResult getUser(@RequestParam("id") Long id) {
    User user = userService.getUserById(id);
    return CommonResult.success(user);
}

如果 UserService 中的 getUserById(id) 方法抛出异常,则会被 GlobalExceptionHandler 捕获,并返回统一的异常响应结果。

2.创建一个类实现 ErrorController 接口

实现 ErrorController 接口可以获取到所有的错误信息。我们也可以自定义错误信息,处理后输出到统一的格式。

第一步:创建全局异常处理器类

@RestController
public class GlobalExceptionHandler implements ErrorController {

    /**
     * 实现 ErrorController 接口,获取错误路径
     */
    @Override
    public String getErrorPath() {
        return "/error";
    }

    /**
     * 捕获所有的异常,并进行处理
     */
    @RequestMapping("/error")
    public CommonResult handleError(HttpServletRequest request) {
        // 获取错误状态码
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");

        // 根据状态码,返回相应信息
        if (statusCode == 500) {
            return CommonResult.error("系统异常,请稍后再试!");
        } else if (statusCode == 404) {
            return CommonResult.error("未找到资源,请检查请求地址是否正确!");
        } else {
            return CommonResult.error("系统错误,请稍后再试!");
        }
    }
}

第二步:测试异常处理效果

@RequestMapping("/getUser")
public CommonResult getUser(@RequestParam("id") Long id) {
    User user = userService.getUserById(id);
    return CommonResult.success(user);
}

如果 UserService 中的 getUserById(id) 方法抛出异常,则会被 GlobalExceptionHandler 捕获,并返回统一的异常响应结果。

三、Spring Boot 统一异常处理示例

示例一

先定义一个测试 Controller:

@RestController
public class TestController {

    @RequestMapping("/test1")
    public String test1(Integer num) {
        int i = 1 / num;
        return "result:" + i;
    }
}

在访问 http://localhost:8080/test1?num=0 时,由于参数 num 为0,会出现异常信息,此时可以通过全局异常处理进行捕获和统一处理。

使用 @ControllerAdvice 实现全局异常处理:

@ControllerAdvice
public class GlobalExceptionHandler1 {
    /**
    * 处理除数为0异常
    */
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public String handleDivideZeroException(ArithmeticException e) {
        return "参数错误,除数不能为0";
    }
}

使用实现 ErrorController 接口实现全局异常处理:

@RestController
public class GlobalExceptionHandler2 implements ErrorController {

    /**
     * 实现 ErrorController 接口,获取错误路径
     */
    @Override
    public String getErrorPath() {
        return "/error";
    }

    /**
     * 处理除数为0异常
     */
    @RequestMapping("/error")
    public String handleDivideZeroException(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == 500)
            return "系统错误,请稍后再试";
        else
            return "参数错误,除数不能为0!";
    }
}

示例二

定义一个自定义异常类,然后在 Controller 中抛出该异常,并通过全局异常处理进行捕获和处理。

定义自定义异常类:

public class CustomException extends RuntimeException {
    private Integer code;
    private String message;

    public CustomException(Integer code, String message) {
        super(message);
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

定义一个测试 Controller:

@RestController
public class TestController {

    @RequestMapping("/test2")
    public String test2(Integer num) {
        if (num == null)
            throw new CustomException(1001, "参数不能为空");
        return "result:" + num;
    }
}

使用 @ControllerAdvice 实现全局异常处理:

@ControllerAdvice
public class GlobalExceptionHandler3 {
    /**
    * 处理自定义异常
    */
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public CommonResult handleCustomException(CustomException e) {
        log.error("自定义异常:", e);
        return CommonResult.error(e.getCode(), e.getMessage());
    }
}

使用实现 ErrorController 接口实现全局异常处理:

@RestController
public class GlobalExceptionHandler4 implements ErrorController {

    /**
     * 实现 ErrorController 接口,获取错误路径
     */
    @Override
    public String getErrorPath() {
        return "/error";
    }

    /**
     * 处理自定义异常
     */
    @RequestMapping("/error")
    public CommonResult handleCustomException(HttpServletRequest request) {
        // 获取错误状态码
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");

        // 根据状态码,返回相应信息
        if (statusCode == 500) {
            return CommonResult.error("系统异常,请稍后再试!");
        } else if (statusCode == 404) {
            return CommonResult.error("未找到资源,请检查请求地址是否正确!");
        } else if (statusCode == 1001) {
            return CommonResult.error(statusCode, "参数不能为空!");
        } else {
            return CommonResult.error("系统错误,请稍后再试!");
        }
    }
}

以上就是 Spring Boot 统一异常处理的详细攻略,希望能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot统一异常处理详解 - Python技术站

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

相关文章

  • java线程之用Thread类创建线程的方法

    Thread类是Java中常用的一个多线程编程类,使用Thread类可以方便的创建和管理多个线程。下面是使用Thread类创建线程的方法的完整攻略: 1. 继承Thread类 使用Thread类创建线程的一种方法是,继承Thread类并实现其run()方法。run()方法是用来定义线程的执行内容的。通过继承Thread类,可以很方便地创建线程对象,并启动线程…

    Java 2023年5月18日
    00
  • Java编程实现基于用户的协同过滤推荐算法代码示例

    首先来讲解一下“Java编程实现基于用户的协同过滤推荐算法”的完整攻略。 1.什么是协同过滤推荐算法 协同过滤推荐算法是一种根据用户的历史行为来推荐相似物品的算法。它与传统的推荐算法相比,具有更高的精度和个性化的特点。协同过滤推荐算法分为两种类型,即基于用户的协同过滤和基于物品的协同过滤。 2.基于用户的协同过滤推荐算法实现 基于用户的协同过滤推荐算法实现分…

    Java 2023年5月19日
    00
  • Maven在Java8下如何忽略Javadoc的编译错误详解

    当我们在使用 Maven 时,有时会遇到编译错误,尤其是 Javadoc 编译错误。这些错误可能导致构建失败,进而阻碍我们的开发流程。在 Java8 中,我们可以通过以下步骤来忽略 Javadoc 的编译错误。 步骤一:在 pom.xml 中增加配置 在 pom.xml 文件中增加以下配置: <build> <plugins> &lt…

    Java 2023年5月20日
    00
  • java实现文件读写与压缩实例

    Java实现文件读写与压缩实例 文件读取 Java中可以通过File类和FileInputStream类来实现文件读取。其中,File类用于表示文件对象,而FileInputStream类用于读文件的数据流。 下面是一个简单的文件读取的示例代码,读取指定路径下的txt文件: import java.io.File; import java.io.FileIn…

    Java 2023年5月20日
    00
  • Maven如何打入依赖中指定的部分jar包

    Maven是一款常用的Java项目管理工具,能够自动化地完成项目构建、依赖管理等任务。有时候我们需要将一些指定的jar包打入到我们的项目中,这里将介绍如何使用Maven来实现这个功能。 步骤1:修改pom.xml文件 在Maven中,我们可以通过修改项目的pom.xml文件来指定要打入项目的jar包。以将“mysql-connector-java”这个jar…

    Java 2023年5月19日
    00
  • FCKeditor 网页在线编辑器的使用方法

    FCKeditor是一款开源的网页在线编辑器,使用方便,可定制性强,适用于各种网站的文本编辑。下面简单介绍FCKeditor的使用方法。 安装FCKeditor 在FCKeditor的官网上,下载最新的源代码文件;下载地址为:https://sourceforge.net/projects/fckeditor/files/fckeditor/ 将下载的源代码…

    Java 2023年6月15日
    00
  • Java中的ArrayList类常用方法和遍历

    关于Java中的ArrayList类常用方法和遍历,以下是一份详细攻略: ArrayList简介 ArrayList是Java中的一种集合框架,用于存储元素列表,也就是一个动态数组。ArrayList允许我们随意添加、删除、访问列表中的元素,并且会在内部自动调整大小,此外,ArrayList类还提供了一些方便的方法用于操作列表中的元素。 常用方法 下面是Ar…

    Java 2023年5月26日
    00
  • SpringBoot启动类@SpringBootApplication注解背后的秘密

    下面是关于SpringBoot启动类@SpringBootApplication注解背后的秘密的详细讲解攻略。 背景 SpringBoot是一款轻量级、快速开发的JavaWeb框架,但是它的核心思想对很多JavaWeb框架都有着一定的启示意义。在SpringBoot中,启动类使用@SpringBootApplication注解进行标注。 @SpringBoo…

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