Spring Boot统一异常处理详解

yizhihongxing

下面将以“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数组声明、创建、初始化基础的攻略。 什么是Java数组 数组是一种数据结构,可以用来将一系列相同类型的数据存储在同一变量名下。在Java中,数组是一个固定大小的连续内存块,每个元素可以是任何Java数据类型,包括对象和基本类型。 Java数组的声明 Java数组的声明需要明确指定数组的类型、数组名和数组大小。其基本语法如下: t…

    Java 2023年5月26日
    00
  • sprng和struts有什么区别?

    sprng和struts有什么区别? 背景介绍 sprng(简称Spring)和struts是两个常见的Java Web框架,都是基于MVC设计模式。它们都能帮助开发人员加快Web应用程序开发的速度。 区别 1. 关注点不同 Spring框架的主要关注点在于IoC(Inverse of Control,控制反转)和AOP(Aspect-Oriented Pr…

    Java 2023年5月20日
    00
  • 一个例子带你看懂Java中synchronized关键字到底怎么用

    让我来详细讲解“一个例子带你看懂Java中synchronized关键字到底怎么用”的完整攻略。 完整攻略 什么是synchronized关键字? synchronized是Java中的一个关键字,用于线程之间的同步操作。它的作用是给代码块或方法加锁,保证同一时刻只有一个线程可以进入被加锁的代码块或方法。 synchronized关键字的用法 synchro…

    Java 2023年5月26日
    00
  • SpringBoot底层注解超详细介绍

    下面就详细讲解一下 Spring Boot 底层注解的完整攻略。 什么是 Spring Boot? Spring Boot 是一种基于 Spring Framework 的快速应用程序开发框架,它可以方便地创建一个独立的、产品级别的 Spring 应用程序。Spring Boot 通过尽可能地自动配置 Spring 和第三方库的方式,简化了 Spring 应…

    Java 2023年5月15日
    00
  • Spring Boot集成Java DSL的实现代码

    Spring Boot集成Java DSL的实现代码的攻略如下: 1. Java DSL简介 Java DSL,全称Java Domain Specific Language,是一种特定领域的编程语言,针对某个特定的领域进行优化,使得编程更简单、更直观、更易读。 2. Spring Boot集成Java DSL实现的前提条件 要实现Spring Boot集成…

    Java 2023年5月20日
    00
  • 在Java的Hibernate框架中对数据库数据进行查询操作

    下面是在Java的Hibernate框架中对数据库数据进行查询操作的完整攻略,过程中包含两条示例。 1. 准备工作 在进行数据库查询操作之前,需要做好以下准备工作: 确保已经安装并配置好Hibernate框架。 在Hibernate配置文件中配置好数据源。 编写实体类,并在实体类中使用Hibernate注解进行属性和数据库字段的映射。 使用Hibernate…

    Java 2023年5月19日
    00
  • Scala解析Json字符串的实例详解

    Scala解析Json字符串的实例详解 Scala是一种功能强大的编程语言,常用于处理大型、复杂的数据。解析Json字符串在数据处理中很常见,Scala通过多种库提供了解析Json的工具。本文将通过两个示例来详细讲解Scala解析Json字符串的实现方法。 示例1:使用Scala自带的Jackson库解析Json 在Scala中,可以使用自带的Jackson…

    Java 2023年5月26日
    00
  • Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程

    下面是关于Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程的完整攻略,包含两个示例说明。 Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程 Java SSM框架是一种常用的Web应用程序开发框架,它由Spring、SpringMVC和MyBatis三个框架组成。在本文中,我们将介绍如何使用这三个…

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