springboot系列十三: 异常处理

springboot异常处理

  • 基本介绍
  • 拦截器VS过滤器
  • 默认异常页面
    • 应用实例
    • debug取出状态码和错误信息
  • 全局异常
    • 基本说明
    • 应用实例
    • Debug处理流程
  • 自定义异常
    • 基本说明
    • 应用实例
    • Debug处理流程
    • 注意事项和细节

在这里插入图片描述

基本介绍

1.默认情况下,SpringBoot 提供 /error 处理所有错误的映射,当出现错误时,SpringBoot 底层会请求转发到 /error 这个映射。

2.浏览器访问不存在的接口 http://localhost:8084/abc,响应 whitelabel 的错误试图,以 HTML 格式呈现给用户。

注意: 配置登录拦截器时,先登录, 再测试

在这里插入图片描述

3.SpringBoot底层默认由 DefaultErrorViewResolver 处理错误。debug->

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

默认找类路径下的 /error/404.html页面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

不管你请求什么, 都去找类路径下的 /error/4xx.html页面

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

拦截器VS过滤器

1.使用范围不同.
1)过滤器 实现的是 javax.servlet.Filter 接口, 而这个接口是在Servlet规范中定义的, 也就是说过滤器 Filter 的使用要依赖于 Tomcat 等容器, Filter 只能在 web 程序中使用.
2)拦截器(Interceptor) 它是一个 Spring 组件, 并由 Spring 容器管理, 并不依赖 Tomcat 等容器, 是可以单独使用的, 不仅能应用在web程序中, 也可以用于 Application 等程序中.

2.过滤器 和 拦截器的触发时机也不同, 如下图

在这里插入图片描述

1)过滤器Filter是在请求进入容器后, 但是在进入servlet之前进行预处理, 请求结束是在servlet处理完以后.

2)拦截器Interceptor是在请求进入servlet后, 在进入Controller之前进行预处理的, Controller中渲染了对应的视图之后请求结束.

3.说明:过滤器不会处理请求转发, 拦截器会处理请求转发. 因为请求转发是sevlet内部的事。

4.回顾过滤器和拦截器的原理和机制.

默认异常页面

文档:https://docs.spring.io/spring-boot/docs/current/reference/html/index.html

应用实例

需求: 自定义404.html, 500.html, 4xx.html, 5xx.html. 当发生相应错误时, 显示自定义的页面信息

1.创建4个页面, 拷贝即可

1)创建src/main/resources/templates/error/404.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>login</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center"><h1>404 Not Found</h1><a href='#' th:href="@{/}">返回主页面</a>状态码: <h1 th:text="${status}"></h1>错误信息: <h1 th:text="${error}"></h1><br/>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>

2)创建src/main/resources/templates/error/4xx.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>login</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center"><h1>4xx 发生错误了:)</h1><br/>错误状态码: <h1 th:text="${status}"></h1><br/>错误信息: <h1 th:text="${error}"></h1><br/><a href='#' th:href="@{/}">返回主页面</a>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>

3)创建src/main/resources/templates/error/500.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>login</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center"><h1>500 内部服务器出现了问题</h1><br/>状态码: <h1 th:text="${status}"></h1><br/>错误信息: <h1 th:text="${error}"></h1><a href='#' th:href="@{/static}">返回主页面</a>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>

4)创建src/main/resources/templates/error/5xx.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>login</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center"><h1>5xx 发生错误了:)</h1><br/>错误状态码: <h1 th:text="${status}"></h1><br/>错误信息: <h1 th:text="${error}"></h1><br/><a href='#' th:href="@{/static}">返回主页面</a>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>

在这里插入图片描述

2.测试, 登陆后访问 http://localhost:8080/err/eeee

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.创建src/main/java/com/zzw/springboot/controller/MyErrorController.java

@Controller
public class MyErrorController {//模拟一个服务器内部错误, 500错误@GetMapping("/err")public String err() {int i = 10 / 0;return "manage";}//配置post方式, 用get请求 /error2, 会出现405错误@PostMapping("/err2")public String error2() {return "manage";}
}

4.注意: 配置登录拦截器时,先登录, 再测试

5.访问 /err, 生成500错误, 可以看到 500.html.

6.访问 /err2, 生成405错误, 可以看到4xx.html.

7.访问 http://localhost:8084/abc, 生成404错误, 可以看到 404.html

debug取出状态码和错误信息

src/main/resources/templates/error/500.html

<div style="text-align: center"><h1>500 内部服务器出现了问题</h1><br/>状态码: <h1 th:text="${status}"></h1><br/>错误信息: <h1 th:text="${error}"></h1><a href='#' th:href="@{/static}">返回主页面</a>
</div>

1.请求 http://localhost:8084/err

在这里插入图片描述

全局异常

基本说明

1.@ControllerAdvice + @ExceptionHandler 处理全局异常.
2.底层是 ExceptionHandlerExceptionResolver 支持.

应用实例

需求: 演示springboot全局异常使用, 当发生ArithmeticException时, 不使用默认异常机制.

1.新建src/main/java/com/zzw/springboot/exception/GlobalExceptionHandler.java

@Slf4j
//使用这个注解可以标识一个全局异常处理器/对象, 会注入到ioc容器中
@ControllerAdvice
public class GlobalExceptionHandler {//编写方法, 处理指定异常, 可以指定多个异常//Exception ex: 表示传递的异常对象//Model model: 将异常信息, 放入model, 传递到下一个页面@ExceptionHandler({ArithmeticException.class})public String catchGlobalException(Exception ex, Model model) {log.info("异常信息={}", ex.getMessage());//将异常信息, 放入model, 传递到下一个页面model.addAttribute("eror", ex.getMessage());return "error/global";}
}

2.新建src/main/resources/templates/error/global.html

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>全局异常-显示页面</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center"><h1>全局异常/错误 发生了:)</h1><br/>异常/错误信息: <h1 th:text="${error}"></h1><br/><a href='#' th:href="@{/}">返回主页面</a>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>

3.注意: 配置登录拦截器时,先登录, 再测试.
访问 /err, 抛出ArithmeticException异常, 被全局异常处理器的catchArithGlobalException方法捕获

在这里插入图片描述

注意:
1.全局异常处理器优先级大于默认异常处理机制. 所以会进入global.html, 而不是根据状态码进入500.html
2.默认异常处理机制是按照状态码寻找错误页面的.

Debug处理流程

在这里插入图片描述
在这里插入图片描述

放行

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

获取异常发生的方法

在这里插入图片描述

自定义异常

基本说明

1.如果Spring Boot提供的异常不能满足开发需求,可以自定义异常。

2.@ResponseStatus + 自定义异常

3.底层是 ResponseStatusExceptionResolver, 底层调用 response.sendError(statusCode, resolvedReason);

4.但抛出自定义异常后, 仍然会根据状态码, 去匹配使用 xxx.html 显示, 当然也可以将自定义异常, 放在全局异常处理器去处理

应用实例

需求说明
1.自定义一个异常 ZzwAccessException, 当用户访问某个无权访问的路径时, 抛出该异常, 显示自定义异常状态码,

2,访问 http://localhost:8080/err3, 效果

代码实现
1.新建src/main/java/com/zzw/springboot/exception/ZzwAccessException.java

/*** 自定义异常* value = HttpStatus.FORBIDDEN: 表示发生ZzwAccessException异常时, 通过http协议返回的状态码* 这个状态码和自定义异常的对应关系由程序员决定*/
public class ZzwAccessException extends RuntimeException {//构造器public ZzwAccessException(String message) {super(message);}//显式定义无参构造器public ZzwAccessException() {}
}

2.修改src/main/java/com/zzw/springboot/controller/MyErrorController.java

//编写方法, 模拟ZzwAccessException
@GetMapping("/err3")
public String err3(String name) {//如果用户不是zzw, 判定-无权访问if (!"zzw".equals(name)) {throw new ZzwAccessException();}return "manage";//thymeleaf视图解析器//return "redirect:/manage";//重定向 manage.html映射
}

3.测试 http://localhost:8084/err3

在这里插入图片描述

Debug处理流程

在这里插入图片描述
在这里插入图片描述

抛出自定义异常,会先走全局异常的逻辑,全局异常没有指定这个异常

在这里插入图片描述

根据你指定的状态码寻找对应的 403.html
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意事项和细节

1.如果把自定义异常类型,放在全局异常处理器,仍然会走全局异常处理机制。

2.Debug看显示效果,也可自定义异常信息。

指定自定义异常 ZzwAccessException 为全局异常
在这里插入图片描述

会走全局异常的逻辑,不会根据自定义异常状态码去寻找对应的错误页面。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
`
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

无人机手势控制工作原理和算法!

一、无人机手势控制的工作原理 无人机手势控制的工作原理基于计算机视觉技术和图像识别技术。具体来说&#xff0c;无人机上配备的摄像头会捕捉用户的手势动作&#xff0c;并将这些图像数据传输到无人机内置的处理器中。处理器通过内置的算法对图像进行处理和解析&#xff0c;…

雷池社区版 7.1.0 LTS 发布了

LTS&#xff08;Long Term Support&#xff0c;长期支持版本&#xff09;是软件开发中的一个概念&#xff0c;表示该版本将获得较长时间的支持和更新&#xff0c;通常包含稳定性、性能改进和安全修复&#xff0c;但不包含频繁的新特性更新。 作为最受欢迎的社区waf&#xff0c…

自动驾驶---理想汽车智驾进展

1 背景 自媒体---“电车通”从2024年初开始推出智能化评测相关栏目&#xff0c;尤其是针对智能驾驶这一功能做了大量的实测工作&#xff1b;根据综合表现&#xff0c;给测试车型给出了能够直观展示其能力的评分。当评测的对象达到一定数量后&#xff0c;对整个国内车市智驾能力…

跨越科技与文化的桥梁——ROSCon China 2024 即将盛大开幕

在全球机器人技术飞速发展的浪潮中&#xff0c;ROS&#xff08;Robot Operating System&#xff09;作为一款开源的机器人操作系统&#xff0c;已成为无数开发者、研究人员和企业的首选工具。为了进一步推动ROS的应用与发展&#xff0c;全球知名的机器人操作系统会议——ROSCon…

制作并量化GGUF模型上传到HuggingFace和ModelScope

llama.cpp 是 Ollama、LMStudio 和其他很多热门项目的底层实现&#xff0c;也是 GPUStack 所支持的推理引擎之一&#xff0c;它提供了 GGUF 模型文件格式。GGUF (General Gaussian U-Net Format) 是一种用于存储模型以进行推理的文件格式&#xff0c;旨在针对推理进行优化&…

docker+nacos

安装数据库 以docker安装为例&#xff08;实际建议实体&#xff09; 初始化数据库 /******************************************/ /* 数据库全名 nacos_config */ /* 表名称 config_info */ /******************************************/ CREATE TABLE config_i…

Linux入门(2)

林纳斯托瓦兹 Linux之父 1. echo echo是向指定文件打印内容 ehco要打印的内容&#xff0c;不加任何操作就默认打印到显示器文件上。 知识点 在Linux下&#xff0c;一切皆文件。 打印到显示器&#xff0c;显示器也是文件。 2.重定向 >重定向操作&#xff0c;>指向的…

PL端:HDMI 输出实验

实验环境 vivado 2024.1 实验任务 做一个 HDMI 输出的彩条 硬件介绍 开发板没有HDMI编码芯片&#xff0c;是将FPGA的3.3差分IO直接连接到HDMI连接器&#xff0c;FPGA 完成 24 位 RGB 编码输出TMDS 差分信号。 HDMI传输要素&#xff1a; TMDS 差分信号 TMDS&#xff08…

江协科技STM32学习- P35 硬件I2C读写MPU6050

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

39页PDF | 华为数据架构建设交流材料(限免下载)

一、前言 这份报告是关于企业数据架构建设的交流材料&#xff0c;详细介绍了数据架构在企业架构中的重要性&#xff0c;阐述了数据架构的定义、包含的四个核心组件&#xff08;数据资产目录、数据标准、数据模型和数据分布&#xff09;&#xff0c;并通过交通和城市政务服务的…

三周精通FastAPI:27 使用使用SQLModel操作SQL (关系型) 数据库

官网文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/sql-databases/ SQL (关系型) 数据库 FastAPI不需要你使用SQL(关系型)数据库。 但是您可以使用任何您想要的关系型数据库。 这里我们将看到一个使用SQLModel的示例。 SQLModel是在SQLAlchemy和Pydantic的基础…

专业140+总分430+四川大学854信号与系统考研川大原951电子信息与通信工程,真题,大纲,参考书。

川大854(原951)信号与系统140&#xff0c;总分430&#xff0c;顺利上岸&#xff0c;目前已经研究生在读&#xff0c;群里不少同学希望分享一下我的考研经历&#xff0c;回首考研这一年的复习经历&#xff0c;历历在目&#xff0c;好像就在昨天&#xff0c;期间有过迷惑&#xf…

蓝桥杯第21场小白入门赛补题

5.蓝桥派对 思路 &#xff1a;一个区间与多少个其他区间有关联&#xff0c;先对所有区间左端点和右端点从小到大排序&#xff0c;对于每个询问&#xff0c;我们先算出[1,r]这个区间里有多少个区间的起点即区间总数&#xff0c;使用upper_bound函数&#xff0c;然后使用lower_bo…

【再谈设计模式】原型模式~复制的魔法师

一、引言 在软件工程、软件开发中&#xff0c;创建对象的过程常常涉及复杂的初始化和配置。在某些情况下&#xff0c;直接复制现有对象比从头开始创建新对象更为高效。原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;允许我们通过复制现有…

技术分享 —— JMeter接口与性能测试实战!

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

Data+AI━━数据安全的警钟:智能化分类分级治理

DataAI━━数据安全的警钟&#xff1a;智能化分类分级治理 前言数据的分类体系数据分级与智能化实践深度案例解析与未来展望 前言 OpenAI数据泄露事件让数据安全再次成为科技圈的热门话题。2024年3月,一名研究员发现OpenAI的API存在安全漏洞,导致部分用户的对话记录泄露。 这一…

【K8S问题系列】Kubernetes Pod节点CrashLoopBackOff 状态【已解决】

在 Kubernetes 中&#xff0c;Pod 的状态为 CrashLoopBackOff 表示某个容器在启动后崩溃&#xff0c;Kubernetes 尝试重启该容器&#xff0c;但由于持续崩溃&#xff0c;重启的间隔时间逐渐增加。下面将详细介绍 CrashLoopBackOff 状态的原因、解决方案及相关命令的输出解释。 …

图像信号处理器(ISP,Image Signal Processor)详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 图像信号处理器&#xff08;ISP&#xff0c;Image Signal Processor&#xff09; 是专门用于处理图像信号的硬件或处理单元&#xff0c;广泛应用于图像传感器&#xff08;如 CMOS 或 CCD 传感器&a…

u盘怎么重装电脑系统_u盘重装电脑系统步骤和详细教程【新手宝典】

u盘怎么重装电脑系统&#xff1f;一个u盘怎么重装电脑系统呢&#xff0c;需要将u盘制作成u盘启动盘pe&#xff0c;然后通过U盘启动盘进入pe进行安装系统&#xff0c;下面小编就教大家u盘重装电脑系统步骤和详细教程。 u盘启动是什么意思&#xff1f; U盘启动盘是一种具有特殊功…

SpringBoot健身房管理:技术与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…