当前位置: 首页 > news >正文

SpringBoot之异常处理

文章目录

  • 前言
  • 一、默认规则
  • 二、定制异常处理处理
    • 自定义错误页面
    • @ControllerAdvice+@ExceptionHandler处理全局异常
    • @ResponseStatus+自定义异常
    • 自定义实现 HandlerExceptionResolver 处理异常
  • 三、异常处理自动配置原理
  • 四、异常处理流程
  • 总结


前言

包含SpringBoot默认处理规则、如何定制错误(异常)处理逻辑、异常处理步骤流程、自定义处理代码。


一、默认规则

  • 默认情况下,Spring Boot提供/error处理所有错误的映射

  • 机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据:

{"timestamp": "2020-11-22T05:53:28.416+00:00","status": 404,"error": "Not Found","message": "No message available","path": "/asadada"
}

在这里插入图片描述

  • 要对其进行自定义,添加View解析为error

  • 要完全替换默认行为,可以实现 ErrorController 并注册该类型的Bean定义,或添加ErrorAttributes类型的组件以使用现有机制但替换其内容。

  • /templates/error/下的4xx,5xx页面会被自动解析,遇见4或5开头的错误会自动找到这俩页面
    在这里插入图片描述

二、定制异常处理处理

自定义错误页面

error/404.html error/5xx.html;有精确的错误状态码页面就匹配精确(如404就找404.html),没有就找 4xx.html;如果都没有就触发白页。

在这里插入图片描述

@ControllerAdvice+@ExceptionHandler处理全局异常

  • 底层是 ExceptionHandlerExceptionResolver 支持的。
package com.dragon.admin.exception;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {@ExceptionHandler({ArithmeticException.class, NullPointerException.class})//捕获的异常public String handlerArithmeticException(Exception e){log.error("异常是:{}",e);return "login";//捕获异常后返回的view}
}

@ResponseStatus+自定义异常

  • 底层是 ResponseStatusExceptionResolver ,把responsestatus注解的信息底层调用 response.sendError(statusCode, resolvedReason);tomcat发送的/error。
  • response.sendError(statusCode, resolvedReason) 方法相当于给Tomcat再次发送请求,请求为/error。且ResponseStatusExceptionResolver在调用完response.sendError()后会返回一个空view和空model的ModelAndView对象实例,以便结束本次请求的后续流程,直接进入/error请求处理逻辑。
  • 将状态码和错误原因组装成ModelAndView
package com.dragon.admin.exception;import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;@ResponseStatus(value = HttpStatus.FORBIDDEN,reason = "用户数量太多")
public class UserTooManyException extends RuntimeException{public UserTooManyException(){}public UserTooManyException(String message){super(message);}
}
    @GetMapping("/cc")public String cc(Model model){//表格内容的遍历List<User> users = Arrays.asList(new User("zhangsan","123456"),new User("lisi","12344"),new User("haha","aaaaa"),new User("hehe","bbbb"));model.addAttribute("users",users);if(users.size()>3){throw new UserTooManyException();}return "table/aa";//这是在templates下有个table里面存放的aa.html}

大家只需要关注异常信息:用户数量太多。这个报错页面是我随便套用的,不要纠结状态码。
在这里插入图片描述

自定义实现 HandlerExceptionResolver 处理异常

可以作为默认的全局异常处理规则。
最终调用HttpServletResponseImpl的sendError方法。

@Order(value = Ordered.HIGHEST_PRECEDENCE)//设置优先级到最高
@Component
public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {try {response.sendError(511,"我喜欢的错误");} catch (IOException e) {throw new RuntimeException(e);}return new ModelAndView();}
}

三、异常处理自动配置原理

  • ErrorMvcAutoConfiguration 自动配置异常处理规则
    • 容器中的组件:类型:DefaultErrorAttributes -> id是errorAttributes
      • public class DefaultErrorAttributes implements ErrorAttributes, HandlerExceptionResolver
        
      • DefaultErrorAttributes:定义错误页面中可以包含哪些数据。
        
      在这里插入图片描述
    • 容器中的组件:类型:BasicErrorController --> id是basicErrorController(json+白页 适配响应)
      • 处理默认 /error 路径的请求;页面响应 new ModelAndView("error", model);
        
      • 容器中有组件 View->id是error;(响应默认错误页)
        
      • 容器中放组件 BeanNameViewResolver(视图解析器);按照返回的视图名作为组件的id去容器中找View对象。
        
    • 容器中的组件:类型:DefaultErrorViewResolver -> id是conventionErrorViewResolver
      • 如果发生错误,会以HTTP的状态码 作为视图页地址(viewName),找到真正的页面
      • error/404、5xx.html

四、异常处理流程

  • 执行目标方法,目标方法运行期间有任何异常都会被catch、而且标志当前请求结束;并且用 dispatchException 来保存catch到的异常
  • 进入视图解析流程(页面渲染) :processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);(有异常时,mv为空,异常保存在了dispatchException中)
  • mv = processHandlerException;处理handler发生的异常,处理完成返回ModelAndView;
    • 遍历所有的 handlerExceptionResolvers,看谁能处理当前异常【HandlerExceptionResolver处理器异常解析器】在这里插入图片描述

    • 系统默认的 异常解析器;在这里插入图片描述

      • DefaultErrorAttributes先来处理异常。把异常信息保存到request域,并且返回null;
      • 默认没有任何人能处理异常,所以异常会被抛出
        • 1.如果没有任何人能处理最终底层就会发送 /error 请求。会被底层的BasicErrorController处理
        • 2 .解析错误视图;遍历所有的 ErrorViewResolver 看谁能解析。
        • 3.默认的 DefaultErrorViewResolver ,作用是把响应状态码作为错误页的地址,error/500.html
        • 4.模板引擎最终响应这个页面 error/500.html (举个例子)
  • DefaultErrorAttribbutes只负责保存错误信息进request域,不能处理异常。
  • HandlerExceptionResolverComposite中的三个resolver默认无法处理异常,只有在特定情况下(如有相对应的异常注解等)才能发挥作用处理异常。

总结

以上就是SpringBoot关于异常处理的讲解。

相关文章:

SpringBoot之异常处理

文章目录 前言一、默认规则二、定制异常处理处理自定义错误页面ControllerAdviceExceptionHandler处理全局异常ResponseStatus自定义异常自定义实现 HandlerExceptionResolver 处理异常 三、异常处理自动配置原理四、异常处理流程总结 前言 包含SpringBoot默认处理规则、如何定…...

Flask-[实现websocket]-(2): flask-socketio文档学习

一、简单项目的构建 flask_websocket |---static |---js |---jquery-3.7.0.min.js |---socket.io_4.3.1.js |---templates |---home |---group_chat.html |---index.html |---app.py 1.1、python环境 python3.9.0 1.2、依赖包 Flask2.1.0 eventlet0.33.3 #使用这个性能会…...

网页中使用的图片格式

网页中使用的图片格式有以下几种&#xff0c;各有优缺点&#xff1a; JPEG&#xff1a;适用于照片或彩色图像&#xff0c;支持16.7万种颜色&#xff0c;有损压缩&#xff0c;可以调节压缩比和质量&#xff0c;文件较小&#xff0c;加载较快PNG&#xff1a;适用于图标或透明图像…...

【android】如何设置LD_LIBRARY_PATH?

目录 一 配置方法 1 进入Android shell 2 使用export命令 3 使用echo命令查看变量是否设置成功 二 扩展 1 LD_LIBRARY_PATH设置多个路径 2 push文件 一 配置方法 android中配置LD_LIBRARY_PATH的方法具体为&#xff1a; 1 进入Android shell adb shell 2 使用export…...

【hadoop3.x】一 搭建集群调优

一、基础环境安装 https://blog.csdn.net/fen_dou_shao_nian/article/details/120945221 二、hadoop运行环境搭建 2.1 模板虚拟机环境准备 0&#xff09;安装模板虚拟机&#xff0c;IP 地址 192.168.10.100、主机名称 hadoop100、内存 4G、硬盘 50G 1&#xff09;hadoop100…...

linux使用操作[2]

文章目录 版权声明网络传输ping命令wget命令curl命令端口linux端口端口命令和工具 进程管理查看进程关闭进程 主机状态top命令内容详解磁盘信息监控 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相…...

华南理工大学电子与信息学院23年预推免复试面试经验贴

运气较好&#xff0c;复试分数90.24&#xff0c;电科学硕分数线84、信通83、专硕电子与信息74. 面试流程&#xff1a; 1&#xff1a;5min ppt的介绍。其中前2min用英语简要介绍基本信息&#xff0c;后3min可用英语也可用中文 介绍具体项目信息如大创、科研、竞赛等&#xff08…...

Linux网络编程- ether_header iphdr tcphdr

struct ether_header struct ether_header 是一个数据结构&#xff0c;用于表示以太网&#xff08;Ethernet&#xff09;帧的头部。这个结构体在 <netinet/if_ether.h> 头文件中定义。当你处理或分析以太网帧时&#xff0c;可以使用这个结构体来访问和解读 Ethernet 头部…...

wpf中的StaticResource和DynamicResource

不同点一&#xff1a;StaticResource是程序载入时对资源的一次性使用&#xff0c;之后就不在访问了 DynamicResouce则是程序运行过程中回去访问资源 样例&#xff1a;在xaml中定义好的资源 <Window.Resources><SolidColorBrush x:Key"borderRed" Color"…...

数据结构与算法基础-(3)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

maven中relativepath标签的含义

一 relative标签的含义 1.1 作用 这个<parent>下面的<relativePath>属性&#xff1a;parent的pom文件的路径。 relativePath 的作用是为了找到父级工程的pom.xml;因为子工程需要继承父工程的pom.xml文件中的内容。然后relativePath 标签内的值使用相对路径定位…...

Greenplum 对比 Hadoop

Greenplum属于MPP架构&#xff0c;和Hadoop一样都是为了解决大规模数据的并行计算而出现的技术&#xff0c;两者的相似点在于&#xff1a; 分布式存储&#xff0c;数据分布在多个节点服务器上分布式并行计算框架支持横向扩展来提高整体的计算能力和存储容量都支持X86开放集群架…...

OJ练习第182题——字典树(前缀树)

字典树&#xff08;前缀树&#xff09; 208. 实现 Trie (前缀树)题目描述示例知识补充官解代码 211. 添加与搜索单词 - 数据结构设计题目描述示例思路Java代码 208. 实现 Trie (前缀树) 力扣链接&#xff1a;208. 实现 Trie (前缀树) 题目描述 示例 知识补充 插入字符串 我…...

前端知识总结

在前端开发中&#xff0c;y x是一种常见的自增运算符的使用方式。它表示将变量x的值自增1&#xff0c;并将自增后的值赋给变量y。 具体来说&#xff0c;x是一种后缀自增运算符&#xff0c;表示将变量x的值自增1。而y x则是将自增前的值赋给变量y。这意味着在执行y x之后&am…...

中国JP-10燃料行业市场研究与预测报告(2023版)

内容简介&#xff1a; 高密度燃料是指以石油基、煤基和生物质基烃类为原料&#xff0c;通过聚合、加氢、异构等工艺合成的密度大于0.85 gcm-3的饱和多环碳氢化合物&#xff0c;广泛应用于航空航天领域。由于高密度燃料密度大和体积热值高等特点&#xff0c;飞行器在油箱体积一…...

护眼灯显色指数应达多少?眼科医生推荐灯光显色指数多少合适

台灯的显色指数是其非常重要的指标&#xff0c;它可以表示灯光照射到物体身上&#xff0c;物体颜色的真实程度&#xff0c;一般用平均显色指数Ra来表示&#xff0c;Ra值越高&#xff0c;灯光显色能力越强。常见的台灯显色指数最低要求一般是在Ra80以上即可&#xff0c;比较好的…...

AI 大模型

随着人工智能技术的迅猛发展&#xff0c;AI 大模型逐渐成为推动人工智能领域提升的关键因素&#xff0c;大模型已成为了引领技术浪潮研究和应用方向。大模型即大规模预训练模型&#xff0c;通常是指那些在大规模数据上进行了预训练的具有庞大规模和复杂结构的人工智能模型&…...

一个案例熟悉使用pytorch

文章目录 1. 完整模型的训练套路1.2 导入必要的包1.3 准备数据集1.3.1 使用公开数据集&#xff1a;1.3.2 获取训练集、测试集长度&#xff1a;1.3.3 利用 DataLoader来加载数据集 1.4 搭建神经网络1.4.1 测试搭建的模型1.4.2 创建用于训练的模型 1.5 定义损失函数和优化器1.6 使…...

MySQL - limit 分页查询 (查询操作 五)

功能介绍&#xff1a;分页查询&#xff08;limit&#xff09;是一种常用的数据库查询技术&#xff0c;它允许我们从数据库表中按照指定的数量和顺序获取数据&#xff0c;它在处理大量数据时特别有用&#xff0c;可以提高查询效率并减少网络传输的数据 语法&#xff1a;SELECT …...

代码随想录笔记--动态规划篇

1--动态规划理论基础 动态规划经典问题&#xff1a;① 背包问题&#xff1b;② 打家劫舍&#xff1b;③ 股票问题&#xff1b; ④ 子序列问题&#xff1b; 动态规划五部曲&#xff1a; ① 确定 dp 数组及其下标的含义&#xff1b; ② 确定递推公式&#xff1b; ③ 确定 dp 数组…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...