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 {
    @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 注解和使用配置类处理异常。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring WebFlux 初探-响应式编程-021

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

[HUBUCTF 2022 新生赛]ezsql

测试无结果 扫描目录&#xff0c;得到源码 找到注入点 思路&#xff1a;更新资料的时候可以同时更新所有密码 我们需要知道密码的字段名 爆库 nicknameasdf&age111,description(select database())#&descriptionaaa&token31ad6e5a2534a91ed634aca0b27c14a9 爆表…

外网ip地址怎么获取?快解析

大家都清楚互联网是通过ip地址通信的&#xff0c;ip地址又分内网ip和外网ip。内网ip只能在内网使用&#xff1b;而外网ip作为电脑唯一标识&#xff0c;可在公网使用。那么外网ip地址怎么获取呢&#xff1f; 外网ip是网络运营商分配给用户的。目前最常见的两种上网方式一个是拉…

Muse论文精读

Muse Abstract 我们介绍了Muse&#xff0c;一个文本到图像的Transformer模型&#xff0c;它实现了最先进的图像生成性能&#xff0c;同时比扩散或自回归模型更有效。Muse是在离散标记空间中的掩码建模任务上进行训练的:给定从预训练的大型语言模型(LLM)中提取的文本嵌入&…

【保姆级介绍下运维】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

nginx反向代理使用(详细版)

1. 下载nginx&#xff0c;解压&#xff1b;&#xff08;随便放在哪里&#xff09; 2. 在nginx-1.26.0文件夹下创建web文件夹&#xff0c;继续在web文件夹下创建abcd.test.cn文件夹&#xff08;文件夹的名字就叫abcd.test.cn&#xff09;&#xff1b; 3. 配置前端代理&#xff…

【现代C++】三路比较运算符

C20引入了三路比较运算符&#xff08;也称为太空船运算符&#xff0c;<>&#xff09;&#xff0c;它允许同时比较两个值&#xff0c;并返回它们的相对顺序。这个运算符简化了需要定义多个比较运算符&#xff08;如、!、<、<、>、>&#xff09;的类的代码&…

吞吐量 和 延时的关系

关于吞吐量/吞吐率、延时&#xff0c;你可以通过 Jmeter中的”聚合报告“和”用表格查看报告“来获取。 Throughput 越大&#xff0c;Latency 越差&#xff1a;因为请求过多&#xff0c;系统繁忙导致响应速度降低。Latency 的值越小说明能支持的 Throughput 越高&#xff1a;L…

全像宇宙投影第三部时间与空间(全文)下载

当这个人向空中凝视时&#xff0c;他所在的房间渐渐变得透明而朦胧&#xff0c;空中渐渐浮现一个久远前景像。突然他觉得自己在皇宫中庭内&#xff0c;他面前站著一位年轻女士非常美丽&#xff0c;有著橄榄色的皮肤。他可以见到她的颈项、手腕、脚踝上都挂著金饰&#xff0c;还…

如何使用AzurEnum快速枚举Microsoft Entra ID(Azure AD)

AzurEnum是一款针对Azure的安全工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松快速地枚举Microsoft Entra ID&#xff08;Azure AD&#xff09;。 该工具基于纯Python 3开发&#xff0c;可以在Windows和Linux系统上运行&#xff0c;但考虑到性能和稳定性&a…

windows下mysql5.6下载安装(多实例安装)

目录 1、下载 2、安装步骤 3、mysql多实例安装 1、下载 http://dev.mysql.com/downloads/windows/installer/5.6.html 2、安装步骤 我们采用自定义安装模式&#xff1a;选择32位或64位 默认即可&#xff1a; 说明&#xff0c;如果没有该页面就上一步&#xff0c;选择高级选…

类人速度超快语音响应!OpenAI推出新旗舰模型GPT-4o,图文音频手机AI搞定

内容概述 虽然没有带来备受期待的人工智能&#xff08;AI&#xff09;搜索引擎&#xff0c;但OpenAI在主打产品AI模型上花了更多心思&#xff0c;拓展多模态功能&#xff0c;让用户可以免费玩转文字、图片和语音输入。 美东时间5月13日周一&#xff0c;OpenAI首席技术官Mira …

三星将采用铁电材料实现1000层3D NAND

在2022年的技术日上&#xff0c;三星公布了一项宏伟目标&#xff0c;即到2030年推出层数超过1000层的先进NAND芯片。据Wccftech报道&#xff0c;这家韩国存储巨头似乎正逐步接近这一目标&#xff0c;计划在NAND芯片制造中应用新型“铁电”材料。 最近美国火奴鲁鲁举行的VLSI技术…

学习Uni-app开发小程序Day11

今天是学习的第11天&#xff0c;今天学习了组件的生命周期&#xff0c;这里的生命周期&#xff0c;主要是学习uni-app的组件生命周期&#xff0c;虽然vue也有&#xff0c;但主要还是学习uni-app的。1. onLoad 监听页面加载&#xff0c;该钩子被调用时&#xff0c;响应式数据、计…

2024 年第一季度全球互联网中断事件

2024 年第一季度伊始&#xff0c;互联网发生了多起中断事件。陆地和海底电缆的损坏在多个地方造成了问题&#xff0c;而与持续中地缘政治冲突相关的军事行动影响了其他地区的连接。 几个非洲国家以及巴基斯坦的政府下令关闭互联网&#xff0c;主要针对移动网络连接。 被称为Ano…

Taylor Francis科技期刊数据库文献去哪里获取

一、Taylor & Francis科技期刊数据库简介&#xff1a; Taylor & Francis 科技期刊数据库&#xff08;T&F ST Library&#xff09;提供超过520种经专家评审的高质量科学与技术类期刊, 其中超过85%的期刊被Web of Science收录&#xff0c;内容最早至1997年。该科技期…

011.理解事件(events)和流(streams)

在软件系统中&#xff0c;事件是一种用于指示发生了什么事情的消息。该事件可能代表一个技术事件——例如&#xff0c;在GUI应用程序中&#xff0c;您可能会在按下的每个键或每次鼠标移动上看到事件。该事件还可以表示业务发生&#xff0c;例如在金融系统中完成的货币交易。 事…

【启程Golang之旅】环境设置、工具安装与代码实践

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

LearnOpenGL(十七)之混合

一、丢弃片段 有些图片并不需要半透明&#xff0c;只需要根据纹理颜色值&#xff0c;显示一部分&#xff08;alpha值为1.0&#xff09;&#xff0c;或者不显示一部分&#xff08;alpha值为0.0&#xff09;&#xff0c;没有中间情况。我们需要丢弃(Discard)显示纹理中透明部分的…

嵌入式学习71-(内核定时器和传感器)

缺少内核配置文件.config 解决&#xff1a;cp config_mini2440_td35 .config 1.make 编译一下 生成timer.ko文件 2. cp timer.ko ~/nfs/rootfs 为什么要拷贝到rootfs中&#xff0c;这是挂载的根文件系统 &#xff0c;使用nfs作为根文件系统 实际上内核启动的时候并不知道…