Spring Boot异常处理问题小结

 更新时间:2024年05月15日 12:04:35   作者:啊Q老师  
在 Spring Boot 中,异常处理是一个重要的部分,可以允许开发者优雅地处理应用程序中可能发生的错误和异常,这篇文章主要介绍了Spring Boot异常处理问题小结,需要的朋友可以参考下

Spring Boot

前言

在 Spring Boot 中,异常处理是一个重要的部分,可以允许开发者优雅地处理应用程序中可能发生的错误和异常。Spring Boot 提供了一套完整的机制来处理异常,包括全局异常处理、特定异常处理以及自定义错误页面等。而当 Spring Boot 应用程序中发生异常时,Spring Boot 默认会提供一个错误页面来显示错误信息。这个默认的错误页面通常包括一个错误状态码(如 404 或 500 ),一个简短的错误描述,以及一个可选的堆栈跟踪(这取决于应用程序的配置)。通常情况下,开发者往往倾向于自定义错误页面。下面简单介绍 Spring Boot 异常处理的方式。

使用自定义错误页面处理异常

在 Spring Boot 中,自定义错误页面是一种常用来处理异常的方式,并提供用户友好的反馈。开发者可以为特定的 HTTP 状态码(如404、 500等)创建自定义的错误页面,也可以创建一个通用的错误页面来处理所有未捕获的异常。

简单示例:
首先,在 src/main/resources/templates 目录下创建一个错误页面,名为 Error.html 的 Thymeleaf 视图模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ErrorDemo</title>
</head>
    <body>
        <h1 th:text="${status}">异常状态码</h1>
        <p th:text="${error}">错误提示信息</p>
        <p th:if="${message}">异常消息<span th:text="${message}"></span></p>
        <p th:text="exception">错误对象</p>
        <p th:text="errors">JSR303数据校验的异常信息</p>
        <p>Return to <a th:href="@{/}" rel="external nofollow" >Home</a>.</p>
    </body>
</html>

然后,创建 Controller 包再创建一个 TestController 类,并创建一个 Test.html

package cn.edu.SpringBootExceptionHandlingDemo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class TestController {
    @GetMapping("/Test.html")
    public String index(){
        return "Test";
    }
}

最后,启动 Spring Boot ,故意触发异常(如访问一个不存在的 URL ),以查看自定义错误页面
结果如图:

使用 @ExceptionHandler 注解处理异常

在 Spring 中,@ExceptionHandler 注解允许指定一个方法来处理特定类型的异常。当你在控制器( Controller )或全局异常处理类(使用@ControllerAdvice 注解)中使用 @ExceptionHandler 注解时,Spring 会自动将匹配的异常传递给相应的方法进行处理。

简单示例:
首先,在 TestController 类上添加一个数学运算的实现,再使用 @ExceptionHandler 注解指定数字运算类型的异常使用 testError() 方法进行异常处理

package cn.edu.SpringBootExceptionHandlingDemo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class TestController {
    @GetMapping("/Test.html")
    public String index(){
        double math = 20240329/0;
        return "Test";
    }
    // 指定数字运算异常后,使用该方法进行异常处理
    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public ModelAndView testError(Exception exception){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("err",exception);
        // 指定错误视图模板
        modelAndView.setViewName("ErrorExceptionHandler");
        return modelAndView;
    }
}

然后,在 Test.html 上添加运算结果,并创建错误视图模板 ErrorExceptionHandler.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test</title>
</head>
<body>
    运算结果为:<p th:text="${math}" />
    Hello World!!!
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ErrorExceptionHandlerDemo</title>
</head>
<body>
    异常信息:[[${err}]]
</body>
</html>

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/Test.html 并按下回车键
结果如图:

使用 @ControllerAdvice 注解处理异常

使用 @ExceptionHandler 注解虽然比自定义错误页面更加灵活处理异常,但是只局限于使用该注解的 Controller 类内部上。而使用@ControllerAdvice 注解可以定义一个类来包含多个 @ExceptionHandler 方法,每个方法处理特定类型的异常。这样,便不需要在每个控制器中重复编写异常处理逻辑了。

简单示例:
在 Contoller 包内创建一个 AdviceController 类,将上述 @ExceptionHandler 方法剪切到该位置

package cn.edu.SpringBootExceptionHandlingDemo.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class AdviceController {
    // 指定数字运算异常后,使用该方法进行异常处理
    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public ModelAndView testError(Exception exception){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("err",exception);
        // 指定错误视图模板
        modelAndView.setViewName("ErrorExceptionHandler");
        return modelAndView;
    }
}

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/Test.html 并按下回车键
结果一样,但使用 @ControllerAdvice 注解无需重复编写异常处理逻辑:

使用配置类处理异常

在 Spring 中,SimpleMappingExceptionResolver 是一个方便的异常解析器,可以将特定类型的异常映射到特定的视图名称,使得异常处理更加简单和统一;也可以通过配置类来配置 SimpleMappingExceptionResolver ,以便在应用程序中全局处理异常。

简单示例:
创建 Configuration 包并在包内创建一个 ErrorConfiguration 配置类,将 AdviceController 类移除或注释以免影响测试结果

package cn.edu.SpringBootExceptionHandlingDemo.Configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import java.util.Properties;
@Configuration
public class ErrorConfiguration {
    @Bean
    public SimpleMappingExceptionResolver simpleMappingExceptionResolver(){
        SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
        Properties properties = new Properties();
        // 异常处理类型、显示错误视图名称
        properties.put("java.lang.ArithmeticException","ErrorExceptionHandler.html");
        simpleMappingExceptionResolver.setExceptionMappings(properties);
        // 指定异常信息变量名称为 err ,默认为 exception
        simpleMappingExceptionResolver.setExceptionAttribute("err");
        return simpleMappingExceptionResolver;
    }
}

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/Test.html 并按下回车键
结果一样:

使用自定义类处理异常

在 Spring Boot 中,也可以创建一个自定义的异常处理器,通常通过实现 HandlerExceptionResolver 接口或继承 SimpleMappingExceptionResolver 类,并在其中添加自定义逻辑,便可以处理异常。

简单示例:
接着,在 Configuration 内创建一个 CustomErrorConfiguration 自定义类并实现 HandlerExceptionResolver 接口,将 ErrorConfiguration 配置类和 AdviceController 类移除或注释以免影响测试结果

package cn.edu.SpringBootExceptionHandlingDemo.Configuration;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
@Configuration
public class CustomErrorConfiguration implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        // 数字运算类型异常
        if(ex instanceof ArithmeticException){
            modelAndView.setViewName("ErrorExceptionHandler");
        }
        // 异常信息对象
        modelAndView.addObject("err",ex);
        return modelAndView;
    }
}

最后,启动 Spring Boot ,打开浏览器输入 http://localhost:8080/Test.html 并按下回车键
结果一样:

注:
以上是 Spring Boot 异常处理的方式,比较推荐的是使用 @ControllerAdvice 注解和使用配置类处理异常。

到此这篇关于Spring Boot异常处理的文章就介绍到这了,更多相关Spring Boot异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot用JdbcTemplates访问Mysql实例代码

    SpringBoot用JdbcTemplates访问Mysql实例代码

    本篇文章主要介绍了SpringBoot用JdbcTemplates访问Mysql实例代码,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • springcloud 服务降级的实现方法

    springcloud 服务降级的实现方法

    这篇文章主要介绍了springcloud 服务降级的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 解决RabbitMq消息队列Qos Prefetch消息堵塞问题

    解决RabbitMq消息队列Qos Prefetch消息堵塞问题

    这篇文章主要为大家介绍了关于如何解决解决RabbitMq Qos Prefetch消息堵塞的问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-01-01
  • 关于RestTemplate的使用深度解析

    关于RestTemplate的使用深度解析

    这篇文章主要介绍了对RestTemplate的深度解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Swagger2匹配多个controller代码实例

    Swagger2匹配多个controller代码实例

    这篇文章主要介绍了Swagger2匹配多个controller代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 详解Spring框架---IOC装配Bean

    详解Spring框架---IOC装配Bean

    本篇文章主要介绍了详解Spring框架---IOC装配Bean,提供了三种方式实例化Bean,具有一定的参考价值,有兴趣的可以了解一下。
    2017-03-03
  • Python爬虫 12306抢票开源代码过程详解

    Python爬虫 12306抢票开源代码过程详解

    这篇文章主要介绍了Python爬虫 12306抢票开源代码过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 详解FileInputStream读取文件数据的两种方式

    详解FileInputStream读取文件数据的两种方式

    这篇文章主要介绍了详解FileInputStream读取文件数据的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式)

    Java并发系列之AbstractQueuedSynchronizer源码分析(共享模式)

    这篇文章主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • gRPC与SpringBoot整合思路和步骤

    gRPC与SpringBoot整合思路和步骤

    在现代微服务架构中,gRPC已经成为了非常受欢迎的通信协议,与SpringBoot整合,它为开发者提供了简洁、高效构建分布式应用,在整合gRPC与SpringBoot时,将gRPC的服务端和客户端分别封装到SpringBoot的应用中,感兴趣的朋友一起看看吧
    2023-08-08

最新评论