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创建线程的两种方式

    当需要创建线程时,Java提供了两种方式:使用Thread类创建线程和实现Runnable接口创建线程。下面我们分别讲解这两种方式的使用方法。 1. 使用Thread类创建线程 Thread类是Java中用于创建和操作线程的基本类。使用Thread类创建线程可以直接关联想要启动的线程代码,并通过start()方法启动新线程。 示例1:继承Thread类创建线…

    Java 2023年5月18日
    00
  • 教你利用SpringBoot写一个属于自己的Starter

    教你利用SpringBoot写一个属于自己的Starter Spring Boot Starter是一种用于简化Spring应用程序配置的机制。它可以将一组相关的依赖项打包到一个单独的模块中,并提供自动配置和其他功能。本文将详细介绍如何编写一个属于自己的Spring Boot Starter,并提供两个示例。 创建Starter项目 首先,我们需要创建一个M…

    Java 2023年5月15日
    00
  • CentOS 6.8 NFS 文件共享设置的方法

    下面是详细讲解“CentOS 6.8 NFS 文件共享设置的方法”的完整攻略。 一、NFS 文件共享的概念 NFS,即 Network File System(网络文件系统),是一种允许不同的计算机之间共享文件的协议。通过 NFS,远程计算机可以像本地文件一样访问另一台计算机上的文件。NFS 可以提供高效的文件共享,避免了数据复制和同步的繁琐过程。 二、NF…

    Java 2023年6月16日
    00
  • 解决Java中properties文件编码问题

    解决Java中properties文件编码问题可以按照以下步骤进行: 1. 观察properties文件的编码格式 首先需要确定properties文件的编码格式。常见的编码格式有ANSI、UTF-8、UTF-16等等。可以使用文本编辑器打开properties文件,查看编码格式。 2. 使用正确的字符集读取properties文件 读取properties…

    Java 2023年5月20日
    00
  • Springboot文件上传功能的实现

    在Spring Boot应用程序中,我们可以使用MultipartFile类和Spring的MultipartResolver接口来实现文件上传功能。在本文中,我们将介绍如何实现Spring Boot文件上传功能。 增加依赖 首先,我们需要在pom.xml文件中增加Spring Boot Web依赖。下面是一个示例: <dependency> &…

    Java 2023年5月18日
    00
  • js实现登录与注册界面

    下面是“js实现登录与注册界面”的完整攻略: 界面设计 首先,我们需要设计一个简单美观的登录与注册界面,可以使用HTML、CSS和Bootstrap等工具来实现。其中,我们需要添加以下元素: 注册表单:包含用户输入用户名、密码、确认密码等信息的表单; 登录表单:包含用户输入用户名、密码等信息的表单; 注册和登录按钮:用于提交注册和登录表单; 反馈信息:用于提…

    Java 2023年6月15日
    00
  • 基于Listener监听器生命周期(详解)

    基于Listener监听器生命周期(详解) 在Java Web应用中,我们可以通过监听器(Listener)来监听 Web应用中的事件,如ServletContext的创建与销毁、HttpSession的创建与销毁、ServletRequest的创建与销毁等等。本文将详细介绍Listener的生命周期。 1. Listener简介和分类 Listener(监…

    Java 2023年6月15日
    00
  • java中rss解析器(rome.jar和jdom.jar)示例

    一、准备工作 下载并安装Java运行时环境(JRE) 下载jdom.jar和rome.jar两个jar包并添加到项目中 二、使用rome.jar解析rss文件 创建一个URL对象,指向RSS源文件 URL url = new URL("http://example.com/rss.xml"); 使用rome.jar提供的RssFeed对象…

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