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.rhkb.cn/news/327779.html

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

相关文章

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…

2022-1990年 各省碳排放Co2数据集(含数据及参考文献)

碳排放是指人类活动产生的二氧化碳&#xff08;CO2&#xff09;等温室气体释放到大气中的过程。通过划分排放源的范围以避免重复计算的思想&#xff0c;由世界资源研究所在关于企业温室气体排放清单编制的指南中首次提出。城市碳排放核算边界界定借鉴该思想&#xff0c;可分为3…

SQL语句

约束具体表现在表的层面&#xff0c;属性具体表现在字段的层面。 1.SQL语句的类型 根据作用进行分类&#xff1a; DDL 数据定义语言 create&#xff0c;drop&#xff0c;alter DML 数据操作语言&#xff08;对数据本身做操作&#xff0c;增删改查&#xff09; insert&am…

风电功率预测 | 基于PSO-BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于粒子群优化算法(Particle Swarm Optimization, PSO)的BP神经网络是一种常见的方法,用于实现风电功率预测。下面是一个基于PSO-BP神经网络实现风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括…

答辩PPT制作成本高?推荐3个aippt工具

这些网站我愿称之为制作答辩PPT的神&#xff01; 很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT…

PG pageinspect使用与块空间清理学习

1.创建有时候会报错 ERROR: could not open extension control file "/usr/local/pgsql/share/extension/pageinspect.control": No such file or directory 解决方案&#xff1a; 2.使用 PostgreSQL中&#xff0c;对于每一行数据&#xff08;称为一个tuple&#…

JavaScript异步编程——10-async异步函数【万字长文,感谢支持】

异步函数&#xff08;用 async 声明的函数&#xff09; 异步函数的定义 使用async关键字声明的函数&#xff0c;称之为异步函数。在普通函数前面加上 async 关键字&#xff0c;就成了异步函数。语法举例&#xff1a; // 写法1&#xff1a;函数声明的写法async function foo1(…

Python | Leetcode Python题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution:def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:if not nums:return list()results list()nums.sort()visited [False] * len(nums)self.dfs(nums, results, list(), visited, 0)return resultsdef df…

Pytorch读取自己的数据集

数据集 流程图 导包设置tfs创建datasets.ImageFolder创建torch.utils.data.DataLoader() import time import os from tqdm import tqdm import pandas as pd import numpy as np import torch import torchvision import torch.nn as nn import torch.nn.functional as F im…

数据结构与算法学习笔记七---链栈的表示和实现(C++)

目录 1.链栈的概念 2.链栈的链式存储实现 1.初始化 2.销毁 3.清空栈 4.判断栈空 5.栈长 6.获取栈顶元素 7.入栈 8.出栈 9.遍历 10.完整代码 1.链栈的概念 链栈是指采用链式存储结构实现的栈。通常使用单链表来表示。链栈的示意图如下&…

ACL访问控制列表

ACL概述 为什么会有ACL 因为我们要过滤数据流量&#xff0c;要做访问控制&#xff0c;要保障内网安全 ACL是什么 ACL&#xff1a;访问控制列表是一个包含了多个规则的列表&#xff0c;不同规则通过规则号进行区分每个规则都包含动作条件两部分内容动作分为&#xff1a;允许…

【C#】学习获取程序执行路径,Gemini 帮助分析

一、前言&#xff1a; 在Delphi中&#xff0c;如果想要获取当前执行程序的目录&#xff0c;程序代码如下&#xff1a; ExtractFilePath(ParamStr(0)); 今天在分析一个别人做的C#程序时看到了一段C#代码&#xff0c;意思是获取执行程序所在的文件目录&#xff1a; public stat…

使用 scrapyd 部署 scrapy

1.scrapyd 是什么&#xff1f; Scrapyd 是一个用于部署和运行 Scrapy 爬虫项目的服务器应用程序。它使得你可以通过 HTTP 命令来部署、管理和执行多个 Scrapy 爬虫&#xff0c;非常适合持续集成和生产环境中的爬虫部署。 2.安装scrapyd 并使用 2.1 安装 scrapyd F:\scrapydTes…

智能革新:如何用会话式AI提升您的工作效率?

提升职场竞争力&#xff0c;会话式AI产品助你走在时代前沿 在当今的职场环境中&#xff0c;提高工作效率是每一位人力资源管理者追求的目标。而在效率的背后&#xff0c;往往隐藏着工作方法的正确与否。在众多提升效率的方法中&#xff0c;人工智能技术无疑是一股不可忽视的力量…

汇聚荣科技:拼多多开店没有流量应该怎么办?

拼多多开店没有流量是一个常见的问题&#xff0c;许多新手商家都会遇到这样的困境。那么&#xff0c;如何解决这个问题呢?下面从四个方面进行详细阐述。 一、优化店铺和商品 首先&#xff0c;要确保店铺和商品的质量。店铺要有自己独特的风格和特色&#xff0c;商品要有高质量…

Java | Leetcode Java题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> t new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> subsetsWithDup(int[] nums) {Arra…

RK3568平台开发系列讲解(SPI篇)spi_dev 驱动分析

🚀返回专栏总目录 文章目录 一、结构体二、API三、spidev驱动分析3.1、init3.2、probe3.3、spidev_write3.4、spidev_read3.5、spidev_open四、spi_register_driver分析五、spi_dev缺点沉淀、分享、成长

docker 部署 prometheus + Grafana +

# prometheus安装 # 1.拉镜像 docker pull prom/prometheus:v2.43.0 # 2.创建配置文件 mkdir /opt/prometheus/data cd /opt/prometheus/ vi prometheus.yml # 3.使用root用户启动 docker run --name prometheus -d -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/pro…

前端 performance api使用 —— mark、measure计算vue3页面echarts渲染时间

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐Performance api计算持续时间&#x1f496; mark用法&#x1f496; measure用法 ⭐计算echarts渲染的持续时间⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端 performance api使用 —— mark、measure计…

刷题之最长连续序列

哈希表 class Solution { public:int longestConsecutive(vector<int>& nums) {//set记录并且去重nums中的数unordered_set<int>set;for(int i0;i<nums.size();i){set.insert(nums[i]);}int result0;//遍历所有数for(auto iset.begin();i!set.end();i){//如…