SpringBoot(异常处理)

SpringBoot(异常处理)

1.基本介绍

image-20240316085329050

2.debug异常处理机制

1.找到 DefaultErrorViewResolver

image-20240316091137808

2.下断点

image-20240316091208066

3.debug启动,浏览器输出一个不存在的页面

image-20240316091344713

image-20240316091412058

4.第一次查找 error/404
1.查看目前要找的视图名

image-20240316091630892

2.准备去查找资源

image-20240316091804112

3.准备从四个默认存放静态资源的路径来查找

image-20240316091952997

4.从第一个静态资源的存放路径查找资源即在error目录下的404.html

image-20240316092147256

5.在四个路径下都找不到error/404.html

image-20240316092423196

5.第二次查找 error/4xx
1.准备进行第二次查找

image-20240316092603907

2.这次要查找到error/4xx

image-20240316092731120

3.依然从四个静态路径中查找,可想而知还是查不到

image-20240316092903522

6.如果都查找不到,则创建一个ModelAndView对象返回

image-20240316093218327

7.放行,返回错误页面

image-20240316093300824

3.过滤器和拦截器的区别

1.示意图

image-20240316094128348

2.对请求转发的处理
  • 过滤器不会处理请求转发
  • 拦截器会处理请求转发
3.过滤器和拦截器的执行流程示意图

image-20240316100847578

4.自定义异常页面

1.需求分析

image-20240316101559086

2.具体实现
1.注意事项
1.错误文件放置位置
  • 错误页面的格式是error/404.html或者error/4xx.html
  • 如果使用的模板引擎则放到templates目录下
  • 如果没有使用模板引擎则放到四个默认存放静态资源的目录下即可
2.错误页面可以获取的错误信息(request域中)

image-20240316110503393

2.在templates目录下存放几个错误页面

image-20240316104755159

3.404.html 取出错误信息
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>404</h1>
状态码<h2 th:text="${status}"></h2>
错误信息<h2 th:text="${error}"></h2>
</body>
</html>
4.测试

image-20240316105106640

5.MyErrorController.java 测试异常
package com.sun.springboot.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;/*** @author 孙显圣* @version 1.0*/
@Controller
public class MyErrorController {@GetMapping("/err")public String err() {int i = 10 / 0; //此时的错误是500return "sss";}@PostMapping("/err2") //一会使用get的方式请求err2,这样会出现4开头的客户端错误public String err2() {return "sss";}
}
6.测试

image-20240316105826699

image-20240316105834754

3.过滤器和拦截器在找不到资源下的执行流程

image-20240316103901750

5.全局异常

1.基本说明

image-20240316110706864

2.需求分析

image-20240316110828224

3.具体实现
1.创建一个全局异常处理类 Global.java
package com.sun.springboot.exception;import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;/*** @author 孙显圣* @version 1.0*/
@ControllerAdvice //处理异常的Controller
@Slf4j
public class Global {//编写方法处理指定的异常@ExceptionHandler({ArithmeticException.class, NullPointerException.class}) //指定全局处理的异常public String handerException(Exception e, Model model) {System.out.println("异常信息:" + e.getMessage());model.addAttribute("msg", e.getMessage()); //将异常信息放到request域中return "/error/global"; //由于目前使用的模板引擎,所以这里返回的结果会通过路径拼接到templates下面的error/global.html}
}
2.\resources\templates\error\global.html 处理全局异常的页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>全局异常</h1>
错误信息:<h2 th:text="${msg}"></h2>
</body>
</html>
3.测试

image-20240316113443411

6.默认异常和全局异常小结(使用模板引擎方式)

1.默认异常执行流程
  1. 出现异常,中央控制器向/error进行请求转发
  2. /error会从静态资源的存放路径(如果是模板引擎就是templates下面)查找对应的异常处理页面(以404为例)
    1. 首先查找error/404.html,返回一个ModelAndView对象
    2. 如果没有查找到就会查找error/4xx.html,返回一个ModelAndView对象
    3. 如果都没有查找到就会返回一个默认的ModelAndView对象
  3. 视图解析器根据得到的ModelAndView将请求转发到指定的异常处理页面
  4. 将异常处理页面响应到浏览器
2.全局异常
  1. 出现异常,优先查看全局异常处理类
  2. 如果里面有方法处理的该类型的异常,则按照方法的逻辑执行
  3. 如果没有则按照默认异常执行流程执行

7.自定义异常

1.基本介绍

image-20240316125807852

2.需求分析

image-20240316130025894

3.具体实现(使用默认异常处理机制)
1.编写自定义异常 AccessException.java
package com.sun.springboot.exception;import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;/*** @author 孙显圣* @version 1.0* 自定义异常*/
@ResponseStatus(HttpStatus.FORBIDDEN) //指定如果发生异常返回的状态码HttpStatus.FORBIDDEN 这里是403
public class AccessException extends RuntimeException { //继承RuntimeException则表示是一个异常类//表示可以在抛出异常时,指定异常信息public AccessException(String message) {super(message);}//无参构造public AccessException() {}
}
2.触发自定义异常 MyErrorController.java
package com.sun.springboot.controller;import com.sun.springboot.exception.AccessException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;/*** @author 孙显圣* @version 1.0*/
@Controller
public class MyErrorController {//触发自定义的异常@GetMapping("/err3")public String err3() {throw new AccessException("自定义异常被触发!");}
}
3.如果使用默认异常处理机制需要在静态资源文件夹下编写异常处理的html,error/403.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>自定义异常被触发</h1>
</body>
</html>
4.浏览器测试

image-20240316132548593

8.SpringBoot异常处理小结

1.异常处理机制的类型
1.默认异常处理机制(明白原理即可)
  • 到中央控制器,请求转发到/error
  • 根据异常的状态码去静态资源下的error/xxx.html找到指定的文件
  • 不论是否找到都会返回一个ModelAndView对象给视图解析器
  • 视图解析器根据这个对象,请求转发到指定的error/xxx.html
  • 将error/xxx.html返回到浏览器
  • 需要注意的是,如果找不到指定的error/xxx.html文件则会返回一个默认创建的ModelAndView对象,最终在浏览器中体现的错误样式就是如下图:

image-20240316093300824

一句话概括默认异常处理机制:根据异常的状态码来找到指定的error/xxx.html文件返回到浏览器

2.全局异常处理机制(掌握!)
  • @ControllerAdvice + @ExceptionHandler({})注解可以创建全局异常处理类
  • 如果出现异常,则优先会查找全局异常处理类中是否能够捕获到指定异常
  • 如果可以捕获则按照捕获到异常的方法来进行异常处理
  • 否则按照默认异常处理机制处理
2.自定义异常
1.编写自定义异常类
  • 继承RuntimeException
  • 在上面加注解@ResponseStatus()指定响应状态码
  • 添加有参构造器可以在抛出该异常时指定异常信息
2.触发自定义异常
  • 直接 throw new 异常类名(“异常信息”);
3.处理方式
  • 自定义异常跟其他异常一样,也可以通过默认异常处理机制或全局异常处理机制来处理

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

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

相关文章

【Linux进程信号】信号的发送与保存

【Linux进程信号】信号的发送与保存 目录 【Linux进程信号】信号的发送与保存阻塞信号1. 信号其他相关常见概念2. 在内核中的表示3. sigset_t4. 信号集操作函数sigprocmasksigpendingsignal测试这几个系统调用接口 进程地址空间第三讲捕捉信号1. 内核如何实现信号的捕捉2. siga…

Java八股文(Git)

Java八股文のGit Git Git Git 是什么&#xff1f;它有什么作用&#xff1f; Git 是一种分布式版本控制系统&#xff0c;用于管理源代码的变更和追踪。 它可以记录文件更改的历史&#xff0c;帮助多人协同开发&#xff0c;并提供了回滚、分支管理等功能。 Git 和 SVN&#xff0…

下载指定版本的pytorch

下载网址&#xff1a;https://download.pytorch.org/whl/torch_stable.html 参考博客网址&#xff1a;https://blog.csdn.net/wusuoweiieq/article/details/132773977

jetson nano——编译一些包的网址导航,pyside2,qt(持续更新)

目录 1.PySide2下载地址2.tesserocr下载地址3.Qt下载地址4.OpenSSL官网5.latex编译器下载地址5.1MikTex5.2TeX Live 1.PySide2下载地址 https://download.qt.io/official_releases/QtForPython/pyside2/ 如下图&#xff1a; 2.tesserocr下载地址 https://github.com/simonflue…

基于SSM+Vue的家居商城系统(源码+部署说明+演示视频)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

CIDR网络地址、广播地址、网段区间计算说明与计算工具

文章目录 开始问题参考答案 答案解析计算工具测试 开始 好久没有看计算网络&#xff0c;感觉已经完全返给老师了。 最近&#xff0c;有同事遇到个问题&#xff0c;网络一直不对&#xff0c;又开始重新看一下。 相信很多朋友长时间不看也忘了&#xff0c;所以&#xff0c;这里…

详解(实现)堆的接口函数

文章目录 堆堆的顺序存储 准备工作创建头文件Heap.h创建源文件Heap.c头文件的包含定义保存堆数据的结构体 初始化销毁堆插入数据向上调整算法图解算法代码 删除堆顶向下调整算法图解代码 取出堆顶数据求堆的数据个数判断堆是否为空全部代码Heap.hHeap.c 再了解堆之前我们先要了…

云备份项目2

云备份项目 文章目录 云备份项目4. 服务端代码设计4.1 服务端工具类实现4.1.1 文件实用工具类设计4.1.2 Json实用工具类设计 4.2 服务端配置信息模块实现4.2.1 系统配置信息4.2.2 单例文件配置类设计 4.3 服务端数据管理模块实现4.3.1 备份数据类的实现4.3.2 数据管理类的设计 …

[BJDCTF2020]Cookie is so stable

hint提示查看cookies flag.php页面我们先随便输入一个名字 输入后我们重新进一次flag.php&#xff0c;发现cookie里存储了刚刚登陆时输入的用户名&#xff0c;直接猜是ssti 尝试后根据ssti特征判断是twig模板 {{_self.env.registerUndefinedFilterCallback("exec")…

论文阅读——RemoteCLIP

RemoteCLIP: A Vision Language Foundation Model for Remote Sensing 摘要——通用基础模型在人工智能领域变得越来越重要。虽然自监督学习&#xff08;SSL&#xff09;和掩蔽图像建模&#xff08;MIM&#xff09;在构建此类遥感基础模型方面取得了有希望的结果&#xff0c;但…

AI智慧校园电子班牌云平台源码

目录 家长端 学校端 电子围栏 亲情通话 课堂答题 移动化管理模式 统一资源管理平台 模板内容智能更换 家校互联 家长端 多场景通话:上学放学联系、紧急遇险求助联系、日常亲情通话关注孩子人身安全:到校离校情况、进入危险区域预警等。 学校端 课堂秩序管理:提高教…