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.mzph.cn/news/748724.shtml

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

相关文章

AcWing.505 火柴排队(离散化逆序对)

题目 涵涵有两盒火柴&#xff0c;每盒装有 n  根火柴&#xff0c;每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列&#xff0c;同一列火柴的高度互不相同&#xff0c;两列火柴之间的距离定义为&#xff1a; ∑i1n(ai−bi)2 其中 ai表示第一列火柴中第 i个火柴的…

开源漏扫工具:DependencyCheck

开源漏扫工具&#xff1a;DependencyCheck Dependency-Check 是 OWASP&#xff08;Open Web Application Security Project&#xff09;的一个实用开源程序&#xff0c;用于识别项目依赖项并检查是否存在任何已知的&#xff0c;公开披露的漏洞。 DependencyCheck是一个开源的…

【并查集】模版

【模板】并查集 - 洛谷 #include <bits/stdc.h> using namespace std; const int N2e59; int a[N]; int Find(int x) {if(xa[x]){return x;}else{a[x]Find(a[x]);return a[x];} } void push(int x,int y) {a[Find(x)]Find(y);return ; } int main() {int n,m; cin>>…

前端实例:页面布局1(后端数据实现)

效果图 注&#xff1a;这里用到后端语言php&#xff08;页面是.php文件&#xff09;,提取纯html也可以用 inemployee_index.php <?php include(includes/session.inc); $Title _(内部员工首页); $ViewTopic 内部员工首页; $BookMark 内部员工首页; include(includes/…

物理隔离条件下,如何安全高效地进行内外网文件导入导出?

内外网文件导入导出通常指的是在内部网络&#xff08;内网&#xff09;和外部网络&#xff08;外网&#xff09;之间传输文件的过程。这在企业环境中尤其常见&#xff0c;因为内部网络通常包含敏感数据&#xff0c;而外部网络&#xff08;如互联网&#xff09;则允许更广泛的访…

生成对抗网络(GANs):技术演化与广泛应用

目录 前言1 技术原理1.1 基本构成1.2 训练过程1.3 数学原理 2 应用领域2.1 图像合成2.2 数据增强2.3 风格迁移2.4 超分辨率 结论 前言 生成对抗网络&#xff08;GANs&#xff09;&#xff0c;自2014年由Ian Goodfellow及其同事首次提出以来&#xff0c;已经引起了广泛的关注和…

JavaScript进阶:js的一些学习笔记-4

文章目录 1. 拷贝1. 浅拷贝2. 深拷贝 2. 异常处理 1. 拷贝 这里指的拷贝是指拷贝引用类型的数据(对象) 1. 浅拷贝 拷贝对象&#xff1a;Object.assign() 或者 {…obj} 展开运算符 const obj {name:liuze,age:23 } const o {...obj}; o.age 22; console.log(o); console.…

Sparse Convolution 讲解

文章目录 1. 标准卷积与Sparse Conv对比(1)普通卷积(2) 稀疏卷积(3) 改进的稀疏卷积(subm)2 Sparse Conv 官方API3. Sparse Conv 计算3. 1 Sparse Conv 计算流程3. 2 案例3.2.1 普通稀疏卷积3.2.2 subm模式的稀疏卷积3D点云数据非常稀疏,尤其体素化处理后(比如200k的点放…

【spring】@PropertySource 注解学习

PropertySource介绍 PropertySource是Spring框架中的一个注解&#xff0c;主要用于Java配置类中&#xff0c;用于引入额外的属性文件&#xff0c;以便在Spring应用上下文中使用这些属性。 在Spring 3.1引入Java配置后&#xff0c;我们可以通过Configuration注解的类和Bean注解…

Windows11企业版安装WSL2和Ubuntu发布版(避坑)

背景 win10企业版升级win11企业版后&#xff0c;安装WSL2&#xff0c;最后安装WSL的Ubuntu发布版&#xff0c;尝试网上各种方法&#xff0c;还是出现文章第三节所写的问题&#xff0c;差点被这问题搞放弃了&#xff0c;全网少有针对这个问题的答案&#xff0c;有也不顶用&…

【python】自动化工具Selenium与playwright去除webdriver检测

对这个世界如果你有太多的抱怨 跌倒了就不敢继续往前走 为什么人要这么的脆弱 堕落 请你打开电视看看 多少人为生命在努力勇敢的走下去 我们是不是该知足 珍惜一切 就算没有拥有 &#x1f3b5; 周杰伦《稻香》 # -*- coding:utf-8 -*- import timefrom s…

k8s-高可用etcd集群 26

reset掉k8s2&#xff0c;k8s3&#xff0c;k8s4节点 清理完网络插件后重启 快速创建一个k8s集群 修改初始化文件 添加master节点 备份 查看etcd配置 启动docker 将etcd二进制命令从容器拷贝到本机 备份 查看快照状态 删除集群资源 恢复 停掉所有的核心组件 从快照恢复 重启所有…

知识蒸馏Matching logits与RocketQAv2

知识蒸馏Matching logits 公式推导 刚开始的怎么来&#xff0c;可以转看下面证明梯度等于输出值-标签y C是一个交叉熵&#xff0c;我们要求解的是这个交叉熵对的这个梯度。就是你可以理解成第个类别的得分。就是student model&#xff0c;被蒸馏的模型&#xff0c;它所输出的…

RTT——stm32f103的can总线通信

1.创建工程 2.配置时钟和引脚 引脚配置使能CAN 时钟配置&#xff0c;采用外部高速时钟 生成MDK工程后复制相关初始化函数到RTT-studio中 将void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)函数复制至broad.c文件中 将时钟配置函数复制到drv_clk.c中&#xff0c;只复制函数…

C语言—打印如图矩阵

输出矩阵 在一个二维数组中形成并输出如下矩阵: #include <stdio.h> main() { int i,j,a[5][5];for(i0;i<4;i)for(j0;j<4;j)if(i<j) a[i][j]1;else a[i][j]i-j1;for(i0;i<4;i){ for(j0;j<4;j)printf("%d ",a[i][j]);printf("…

Xilinx FPGA模式配置

Xilinx FPGA模式配置 Xilinx UltraScale FPGA有7种配置模式&#xff0c;由模式输入引脚M[2:0]决定。七种模式如图1所示。 图1 7种配置模式 7种模式可分为3大类&#xff0c; 1、JTAG模式&#xff08;可归为从模式&#xff09;&#xff1b; 2、主模式&#xff1b; 3、从模式…

影响交易收益的因素有哪些?

在尝试做交易时&#xff0c;你可能会问自己一个问题&#xff1a;交易一天能赚多少钱&#xff1f;“如果我全职投入交易&#xff0c;一天能赚多少&#xff1f;”或者更广泛地说&#xff0c;“交易能为我带来怎样的财富&#xff1f;”这些问题本质上都充满了不确定性&#xff0c;…

Spring Cloud Alibaba微服务从入门到进阶(一)(SpringBoot三板斧、SpringBoot Actuator)

Springboot三板斧 1、加依赖 2、写注解 3、写配置 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的一系列用于监控和管理应用程序的工具和服务。 SpringBoot导航端点 其中localhost:8080/actuator/health是健康检查端点&#xff0c;加上以下配置&#xf…

pytorch之诗词生成--2

先上代码: # -*- coding: utf-8 -*- # File : dataset.py # Author : AaronJny # Time : 2019/12/30 # Desc : 构建数据集 from collections import Counter import math import numpy as np import tensorflow as tf import settingsclass Tokenizer:""&…

邮件自动化:简化Workplace中的操作

电子邮件在职场中的使用对于企业和组织的日常活动起着重要的作用。电子邮件不再仅仅是一种通信方式&#xff0c;已经成为现代企业和组织实施日常运营的关键要素。 除了通信&#xff0c;电子邮件对于需求生成、流程工作流、交易审批以及各种其他与业务相关的活动至关重要。在当…