Spring Boot:异常处理

Spring Boot

  • 前言
  • 使用自定义错误页面处理异常
  • 使用 @ExceptionHandler 注解处理异常
  • 使用 @ControllerAdvice 注解处理异常
  • 使用配置类处理异常
  • 使用自定义类处理异常

在这里插入图片描述

前言

在 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="@{/}">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 {@Beanpublic SimpleMappingExceptionResolver simpleMappingExceptionResolver(){SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();Properties properties = new Properties();// 异常处理类型、显示错误视图名称properties.put("java.lang.ArithmeticException","ErrorExceptionHandler.html");simpleMappingExceptionResolver.setExceptionMappings(properties);// 指定异常信息变量名称为 err ,默认为 exceptionsimpleMappingExceptionResolver.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 {@Overridepublic 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 注解和使用配置类处理异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702241.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PR标题模板,视频内容要点提示文字列表模板剪辑素材

Premiere Pro的要点列表标题模板。 主要特点&#xff1a; 可以无限制地添加任意数量的列表项。 使用直观的控件轻松自定义列表的各个方面。只需点击几下&#xff0c;即可调整颜色、大小、位置等。 轻松调整颜色&#xff0c;享受完全的创作自由。 可以轻松调整列表项之间的间距…

Day27 代码随想录打卡|栈与队列篇---删除字符串中的所有相邻重复项

题目&#xff08;leecode T1047&#xff09;&#xff1a; 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终…

使用Go和JavaScript爬取股吧动态信息的完整指南

引言 在现代金融生态系统中&#xff0c;信息流动的速度和效率对于市场的健康和投资者的成功至关重要。股市信息&#xff0c;特别是来自活跃交流平台如股吧的实时数据&#xff0c;为投资者提供了一个独特的视角&#xff0c;帮助他们洞察市场趋势和投资者情绪。这些信息不仅能够…

下载element-ui报错

此错误表示尝试从npm注册表下载“resize observer polyfill”包时超时。这可能是由于网络连接问题或npm注册表服务器的问题。 要解决此问题&#xff0c;您可以尝试以下步骤&#xff1a; 1.重试npm install命令&#xff1a;有时&#xff0c;网络问题会导致临时超时。再次运行npm…

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.3-2.5

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.3 指数加权平均数&#xff08;Exponential…

FPGA - Xilinx系列高速收发器---GTX

1&#xff0c;GTX是什么&#xff1f; GT &#xff1a;Gigabit Transceiver千兆比特收发器&#xff1b; GTX &#xff1a;Xilinx 7系列FPGA的高速串行收发器&#xff0c;硬核 xilinx的7系列FPGA根据不同的器件类型&#xff0c;集成了GTP、GTX、GTH、GTZ四种串行高速收发器&am…

Gitlab、Redis、Nacos、Apache Shiro、Gitlab、weblogic相关漏洞

文章目录 一、Gitlab远程代码执行&#xff08;CVE-2021-22205&#xff09;二、Redis主从复制远程命令执行三、Nacos认证绕过漏洞&#xff08;CVE-2021-29441&#xff09;四、Apache Shiro认证绕过漏洞&#xff08;CVE-2020-1957&#xff09;五、Gitlab任意文件读取漏洞&#xf…

实物仿真平台设计方案:927-8路GMSL视频注入回灌的自动驾驶半实物仿真平台

8路GMSL视频注入回灌的自动驾驶半实物仿真平台 一、平台介绍 产品基于8路GMSL视频注入回灌的自动驾驶半实物仿真平台旨在提高实验室及研究生院师生在基础软件层开发、计算机视觉和深度学习方面的专业知识学习和实践能力&#xff0c;为师生提供一个稳定软件开发和多精度框…

安卓APP+TCP+服务器端

1、在.xml文件中添加权限 <uses-permission android:name"android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name"android.permission.INTERNET"/>2、修改显示界面 <?xml version"1.0" encoding"utf-8&…

UML快速入门篇

目录 1. UML概述 2. 类的表示 2.1. 类的表示 2.2. 抽象类的表示 2.3. 接口的表示 3. 类的属性&#xff0c;方法&#xff0c;访问权限的表示 3.1. 类的属性 3.2. 类的方法 3.3. 类的权限 4. 类的关联 4.1. 单向关联 4.2. 双向关联 4.3. 自关联 4.4. 类的聚合 4.5.…

【十大排序算法】----C语言版插入排序(详细图解)

目录 一&#xff1a;插入排序——原理 二&#xff1a;插入排序——分析 三&#xff1a;插入排序——实现 四&#xff1a;插入排序——效率 一&#xff1a;插入排序——原理 插入排序的原理和基本思想&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序…

数据库原理与应用实验八 存储过程

目录 实验目的和要求 实验环境 实验内容与过程 实验内容&#xff1a; 操作过程&#xff1a; 实验目的和要求 熟悉存储过程的定义和使用&#xff0c;熟练运用 select ,update ,insert ,delete 命令完成对学生信息数据库的查询、更新、添加、删除操作。 实验环境 Windo…