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.mzph.cn/diannao/12539.shtml

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

相关文章

复利效应(应用于成长)

应用 每个人在智力、知识、经验上&#xff0c;复利效应都一样&#xff0c;只要能积累的东西&#xff0c;基本上最终都会产生复利效应。 再来看一下复利公式&#xff1a;FP*(1i)^n P本金&#xff1b;i利率&#xff1b;n持有期限。在使用时&#xff0c;一定要注意4个限定条件&a…

AI图书推荐:ChatGPT等生成式AI在高等教育中的应用

自2022年11月以来&#xff0c;ChatGPT及其在高等教育各个层面的影响已成为所有教育对话的核心内容。Chan和Colloton所著的书籍是首批全面探讨ChatGPT与生成式人工智能&#xff08;GenAI&#xff09;在高等教育中应用及影响的作品之一。 该书深入研究了针对专业环境定制的AI素养…

基础学习-Git(分布式版本控制系统)

学习视频推荐 http://【黑马程序员Git全套教程&#xff0c;完整的git项目管理工具教程&#xff0c;一套精通git】 https://www.bilibili.com/video/BV1MU4y1Y7h5/?p5&share_sourcecopy_web&vd_source2b85bd9be9213709642d908906c3d863 1、Git环境配置 安装Git Git下…

wireshark_概念

ARP (Address Resolution Protocol&#xff09;协议&#xff0c;即地址解析协议。该协议的功能就是将IP地址解析成MAC地址。 混杂模式 抓取经过网卡的所有数据包&#xff0c;包括发往本网卡和非发往本网卡的。 非混杂模式 只抓取目标地址是本网卡的数据包&#xff0c;对于发往…

《控制系统实验与综合设计》综合四至六(含程序和题目)

1.电机模型辨识实验 1.1 实验目的 &#xff08;1&#xff09;掌握一阶系统阶跃响应的特点&#xff0c;通过实验加深对直流电解模型的理解&#xff1b; &#xff08;2&#xff09;掌握系统建模过程中参数的整定&#xff0c;体会参数变化对系统的影响&#xff1b; &#xff0…

单片机开发板上外设资源讲解

单片机开发电路板上简单外设 开发板上各基础外设LED灯按键&#xff1a;数码管介绍液晶屏矩阵键盘扫描的概念LED点阵屏实时时钟蜂鸣器存储器 温度传感器&单总线 开发板上各基础外设 LED灯 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&…

杨校老师项目之基于单片机STC89C52的智能环境监测系统【嵌入式】

获取全套资料&#xff1a; 有偿获取&#xff1a;mryang511688 技术&#xff1a;C语言、单片机等 摘要&#xff1a; 此设计可分为三个主要部分。此中的温度和湿度的检测功能&#xff0c;通过操纵单总线型温湿度传感器DHT11以数字形式显示&#xff0c;实现了切确测得温湿度的功能…

如何管理多个版本的Node.js

我们如何在本地管理多个版本的Node.js&#xff0c;有没有那种不需要重新安装软件再修改配置文件和环境变量的方法&#xff1f;经过我的查找&#xff0c;还真有这种方式&#xff0c;那就是nvm&#xff08;Node Version Manager&#xff09;。 下面我就给大家介绍下NVM的使用 1…

vs2019 c++中模板 enable_if_t 的使用

&#xff08;1&#xff09; 该模板的定义如下&#xff1a; template <bool _Test, class _Ty void> struct enable_if {}; // no member "type" when !_Testtemplate <class _Ty> struct enable_if<true, _Ty> { // type is _Ty for _Testusing …

Golang | Leetcode Golang题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; func grayCode(n int) []int {ans : make([]int, 1<<n)for i : range ans {ans[i] i>>1 ^ i}return ans }

MSR810-LM快速配置通过LTE模块上网

正文共&#xff1a;1111 字 13 图&#xff0c;预估阅读时间&#xff1a;1 分钟 之前买了一个无线版本的MSR810-W&#xff08;淘了一台二手的H3C企业路由器&#xff0c;就用它来打开网络世界的大门&#xff09;&#xff0c;并整理了一份快速配置&#xff08;脚本案例来了&#x…

三菱FX3U-4AD模拟量电压输入采集实例

硬件&#xff1a;&#xff30;&#xff2c;&#xff23;模块 &#xff26;&#xff38;&#xff13;&#xff27;&#xff21;-&#xff12;&#xff14;&#xff2d;&#xff34; &#xff1b;&#xff21;&#xff0f;&#xff24;模块&#xff26;&#xff38;&#xff13…

SQL——SERVER的建表主要操作

目录 一&#xff1a;数据存储问题 1.表的相关数据 2.表&#xff0c;字段&#xff0c;记录 二&#xff1a;建表 1.创建表头 2. 数据类型 3.保存数据 4.数据冗余 5.使用命令重置表 7.设置主键 一&#xff1a;数据存储问题 1.表的相关数据 表是数据库的基本单位&…

交互原型设计工具 Axure RP 9 for Mac 正式激活版

Axure RP 9 Pro Mac版是Mac平台上的一款专为快速原型设计而生的应用&#xff0c;Axure RP 9 Pro Mac版可以辅助产品经理快速设计完整的产品原型&#xff0c;并结合批注&#xff0c;说明以及流程图&#xff0c;框架图等元素&#xff0c;将产品完整地表述给各方面设计人员&#x…

Android Studio(AS)使用别人的项目与gradle包并运行项目

一、问题描述 在进行AS开发时&#xff0c;我们可能会使用到别人的项目&#xff0c;但发现别人把项目发给我们后会发现gradle项目同步失败o(≧口≦)o&#xff0c;此时计有三&#xff1a; 1.横行霸道、豪取抢夺&#xff1a;直接空降到项目人那里&#xff0c;强他的电脑占为己有…

Numpy的数组操作

文章目录 数组的创建创建全0的二维数组a(3,3)全1的二维数组b&#xff08;3,4&#xff09;随机数二维数数组c&#xff08;2,3&#xff09;效果截图 数组的属性查看b数组的维度查看b数组元素的个数效果截图 数组的维度操作将数组c的行变列&#xff0c;返回最后一个元素返回数组c第…

【回溯】1240. 铺瓷砖

本文涉及知识点 回溯 LeetCode1240. 铺瓷砖 你是一位施工队的工长&#xff0c;根据设计师的要求准备为一套设计风格独特的房子进行室内装修。 房子的客厅大小为 n x m&#xff0c;为保持极简的风格&#xff0c;需要使用尽可能少的 正方形 瓷砖来铺盖地面。 假设正方形瓷砖的…

3、用Vue快雕塑搭建一个管理系统的页面布局框架

3.2.顶部栏header 在el-header标签里对标签栏header进行样式定义 <template><div id"app"><el-container><el-header style"background-color: #4c535a"><img src"/assets/logo.png" alt"" style"w…

运维别卷系列 - 云原生监控平台 之 05.prometheus alertManager 实践

文章目录 [toc]Alertmanager 简介Alertmanager 实现的核心概念GroupingInhibitionSilencesClient behaviorHigh Availability Alertmanager 配置文件globaltemplatesrouteinhibit_rulesreceivers Alertmanager 部署创建 cm创建 svc创建 stsPrometheus 配置告警Prometheus 配置文…

运维别卷系列 - 云原生监控平台 之 03.prometheus label 实践

文章目录 [toc]label 简介自定义标签relabel_configsregexrelabel_action metric_relabel_configs两者的区别 实践 label 简介 label 对于 Prometheus 来说&#xff0c;属于数据处理的方式&#xff0c;Prometheus 是通过指定的 label 来查询数据 Prometheus 的 target 中实例&…