SpringBoot异常处理原理分析

news2024/11/16 2:20:56

springboot默认机制

错误处理的自动配置都在ErrorMvcAutoConfiguration中,两大核心机制:

    1. SpringBoot 会自适应处理错误,响应页面或JSON数据
    1. SpringMVC的错误处理机制依然保留,MVC处理不了,才会交给boot进行处理

在这里插入图片描述

  • 发生错误以后,转发给/error路径,SpringBoot在底层写好一个 BasicErrorController的组件,专门处理这个请求
	@RequestMapping(produces = MediaType.TEXT_HTML_VALUE) //返回HTML
	public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
		HttpStatus status = getStatus(request);
		Map<String, Object> model = Collections
			.unmodifiableMap(getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
		response.setStatus(status.value());
		ModelAndView modelAndView = resolveErrorView(request, response, status, model);
		return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
	}

	@RequestMapping  //返回 ResponseEntity, JSON
	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
		HttpStatus status = getStatus(request);
		if (status == HttpStatus.NO_CONTENT) {
			return new ResponseEntity<>(status);
		}
		Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));
		return new ResponseEntity<>(body, status);
	}
  • 错误页面是这么解析到的
//1、解析错误的自定义视图地址
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
//2、如果解析不到错误页面的地址,默认的错误页就是 error
return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);

容器中专门有一个错误视图解析器

@Bean
@ConditionalOnBean(DispatcherServlet.class)
@ConditionalOnMissingBean(ErrorViewResolver.class)
DefaultErrorViewResolver conventionErrorViewResolver() {
    return new DefaultErrorViewResolver(this.applicationContext, this.resources);
}

SpringBoot解析自定义错误页的默认规则

	@Override
	public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
		ModelAndView modelAndView = resolve(String.valueOf(status.value()), model);
		if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
			modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
		}
		return modelAndView;
	}

	private ModelAndView resolve(String viewName, Map<String, Object> model) {
		String errorViewName = "error/" + viewName;
		TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName,
				this.applicationContext);
		if (provider != null) {
			return new ModelAndView(errorViewName, model);
		}
		return resolveResource(errorViewName, model);
	}

	private ModelAndView resolveResource(String viewName, Map<String, Object> model) {
		for (String location : this.resources.getStaticLocations()) {
			try {
				Resource resource = this.applicationContext.getResource(location);
				resource = resource.createRelative(viewName + ".html");
				if (resource.exists()) {
					return new ModelAndView(new HtmlResourceView(resource), model);
				}
			}
			catch (Exception ex) {
			}
		}
		return null;
	}

容器中有一个默认的名为 error 的 view; 提供了默认白页功能

@Bean(name = "error")
@ConditionalOnMissingBean(name = "error")
public View defaultErrorView() {
    return this.defaultErrorView;
}

封装了JSON格式的错误信息

	@Bean
	@ConditionalOnMissingBean(value = ErrorAttributes.class, search = SearchStrategy.CURRENT)
	public DefaultErrorAttributes errorAttributes() {
		return new DefaultErrorAttributes();
	}

规则:

  1. 解析一个错误页
    1. 如果发生了500、404、503、403 这些错误
      1. 如果有模板引擎,默认在 classpath:/templates/error/**精确码.html**
      2. 如果没有模板引擎,在静态资源文件夹下找 **精确码.html**
    2. 如果匹配不到精确码.html这些精确的错误页,就去找5xx.html4xx.html模糊匹配
      1. 如果有模板引擎,默认在 classpath:/templates/error/5xx.html
      2. 如果没有模板引擎,在静态资源文件夹下找 5xx.html
  2. 如果模板引擎路径templates下有 error.html页面,就直接渲染

springboot异常处理步骤流程

1、执行目标方法,目标方法运行期间有任何异常都会被catch、而且标志当前请求结束;并且用 **dispatchException **
2、进入视图解析流程(页面渲染?)
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
3、**mv **= processHandlerException;处理handler发生的异常,处理完成返回ModelAndView;

  • 1、遍历所有的 handlerExceptionResolvers,看谁能处理当前异常【HandlerExceptionResolver处理器异常解析器】
  • image.png
  • 2、系统默认的 异常解析器;
  • image.png
    • 1、DefaultErrorAttributes先来处理异常。把异常信息保存到rrequest域,并且返回null;
    • 2、默认没有任何人能处理异常,所以异常会被抛出
      • 1、如果没有任何人能处理最终底层就会发送 /error 请求。会被底层的BasicErrorController处理
      • 2、解析错误视图;遍历所有的 ErrorViewResolver 看谁能解析。
      • image.png
      • **3、默认的 DefaultErrorViewResolver ,作用是把响应状态码作为错误页的地址,error/500.html **
      • **4、模板引擎最终响应这个页面 error/500.html **

最佳实战

  • 前后分离
    • 后台发生的所有错误,**@ControllerAdvice + @ExceptionHandler**进行统一异常处理。
  • 服务端页面渲染
    • 不可预知的一些,HTTP码表示的服务器或客户端错误
      • **classpath:/templates/error/**下面,放常用精确的错误码页面。**500.html****404.html**
      • **classpath:/templates/error/**下面,放通用模糊匹配的错误码页面。 **5xx.html****4xx.html**
    • 发生业务错误
      • 核心业务,每一种错误,都应该代码控制,跳转到自己定制的错误页。
      • 通用业务,**classpath:/templates/error.html**页面,显示错误信息。

页面,JSON,可用的Model数据如下
image.png

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

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

相关文章

《黑神话:悟空》一只横扫全球的中国“猴子”,这里也有!

这个夏天&#xff0c;除了火辣辣的太阳让人燥热难耐&#xff0c;还有一只横空出世的“猴子”让众多网友热血沸腾——8月20日&#xff0c;筹谋7年的首款国产现象级3A游戏大作《黑神话&#xff1a;悟空》&#xff0c;准时登录各大平台&#xff0c;期待已久的玩家们一饱“猴瘾”。…

2024年第四届《英语世界》杯全国大学生翻译大赛

2024年第四届《英语世界》杯全国大学生翻译大赛 第一场下周日开考&#xff01; 一、参赛福利&#xff1a; 1、报名即可获得大赛专属题库、《英语世界》数字刊阅读权限、《英语世界》杯系列赛事公开课珍贵资料&#xff1b; 2、开展线上公开课邀请名师讲解&#xff1b; 3、获…

linux之网络子系统-MAC帧、数据报、段 的头部信息

一、MAC帧 格式 MAC帧是属于链路层&#xff0c;网卡发送数据的格式。 MAC帧主要有两种格式&#xff0c;一种是以太网V2标准&#xff0c;一种是IEEE 802.3&#xff0c;常用的是前者。 DMAC&#xff08;Destination MAC&#xff09;是目的MAC地址。DMAC字段长度为6个字节&#…

突破速度障碍:探索25MBd数字光耦合器在工业自动化中的作用

在快节奏的工业自动化世界中&#xff0c;对能够跟上高速运行同时保持可靠性和安全性的组件的需求至关重要。这些系统中最关键的组件之一是光耦合器&#xff0c;它在机器的不同部分或机器之间传输信号时提供电气隔离。25MBd数字光耦合器的推出代表了该领域的重大进步&#xff0c…

18959 二叉树的之字形遍历

### 思路 1. **输入读取**&#xff1a; - 读取输入字符串&#xff0c;表示完全二叉树的顺序存储结构。 2. **构建二叉树**&#xff1a; - 使用队列构建二叉树&#xff0c;按层次顺序插入节点。 3. **之字形层序遍历**&#xff1a; - 使用双端队列进行层序遍历&…

为何要引入服务注册组件及组件对比

我的后端学习大纲 SpringCloud学习大纲 1.为什么要引入服务注册中心&#xff1a; 1.1.原因说明 1.微服务所在的IP地址和端口号硬编码到订单微服务中&#xff0c;属于硬编码&#xff0c;会存在非常多的问题 如果订单微服务和支付微服务的IP地址或者端口号发生了变化&#xff…

idea配置FTP文件上传

idea配置FTP 连接测试 打开 工具拦打开 maven依赖 <!-- FTP --> <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version> </dependency>FTP-配置 /*** FTP-配置*/ …

数字时代的内容安全治理:审核与管理的艺术

《互联网内容审核与信息安全管理》提供了全面实施互联网内容审核与信息安全管理的方法&#xff0c;主要包括三部分内容。 第一部分&#xff1a;阐释什么是互联网内容审核与信息安全管理&#xff0c;为什么要进行互联网内容审核与信息安全管理&#xff1b;重点分析互联网内容…

vs 项目.gitignore设置过滤某个文件夹无效

问题描述 项目使用tfs进行管理&#xff0c;在使用uniapp开发小程序的时候&#xff0c;每次vs中的更改都会出现99的更改&#xff0c;查看详情发现都是uniapp下面的unpackage文件夹下面的内容。原因是每次重新运行该下面的文件都会重新生成。后来在该项目下面的.gitignore中配置…

【Vue】Echart渲染数据时页面不显示内容

背景 做的一个对话交互的功能&#xff0c;根据后台返回的数据&#xff0c;渲染成Echart图表展示因为图表种类多&#xff0c;因此根据不同图表单独做了一个个vue组件&#xff0c;将数据根据展示类型传到这些子组件中进行渲染无论哪种图表&#xff0c;第一次展示时都能正常展示&…

2024实战指南:四款全免费的数据恢复工具盘点!

在这个数字化的时代里&#xff0c;数据的安全至关重要。如果一不小心删除或丢失了重要数据应该怎么办呢&#xff1f;这几个全免费的数据恢复工具可以帮你解决问题&#xff0c;亲测好用哦&#xff01; 第一款&#xff1a;福昕数据恢复 直达链接&#xff1a;www.pdf365.cn/foxi…

跨系统备忘录迁移有哪些方法?备忘录内容如何跨平台转移?

备忘录作为我们日常生活中常用的软件&#xff0c;帮助我们随时记录重要事项和灵感。然而&#xff0c;随着科技的发展&#xff0c;我们可能会更换不同系统的设备&#xff0c;这时就需要将备忘录内容进行迁移。特别是跨系统的迁移&#xff0c;往往让人感到不便。那么&#xff0c;…

探索挪车小程序源码开发:构建便捷社区生活的智慧桥梁

随着城市化进程的加速&#xff0c;车辆保有量不断增加&#xff0c;停车难、挪车难成为了许多城市居民日常生活中的一大痛点。为了解决这一难题&#xff0c;挪车小程序应运而生&#xff0c;它利用移动互联网的便捷性&#xff0c;为车主之间搭建起一个高效、便捷的沟通平台。本文…

【Python 千题 —— 基础篇】身份证隐藏的信息

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 在一个用户信息管理系统中,你需要处理和验证用户提供的身份证号。编写一个程序来从用户信息字符串中提取和验证身份证号,并提供相应的处理方式…

LLM论文研读: MindSearch

1. 背景 近日中科大与上海人工智能实验室联合推出的MindSearch思索&#xff0c;引起了不小的关注&#xff0c;github上的星标&#xff0c;短短几周时间&#xff0c;已经飙到了4.2K。看来确实有些内容&#xff0c;因此本qiang~研读了论文及代码&#xff0c;针对其中的原理与创新…

自动化测试的使用场景有哪些?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文将通过介绍 自动化测试是什么&#xff1f;哪些场景适用于自动化测试&#xff1f;自动化测试的好处&#xff1f;以及通过 具体的自动化测试工具应用实例来对自动…

【逐行注释】无迹卡尔曼滤波(UKF)的MATLAB代码,附下载链接

文章目录 程序组成部分部分代码及注释展示运行结果主要模块解读&#xff1a;运动模型绘图部分误差统计特性输出 下载链接 程序组成部分 由模型初始化、运动模型、UKF主体部分、绘图代码和输出部分组成&#xff1a; 部分代码及注释展示 运行结果 运行后可以得到三幅图和一段…

uniapp小程序怎么判断滑动的方向

项目场景&#xff1a; 获取手机上手指滑动的距离超过一定距离 来操作一些逻辑 解决方案&#xff1a; 在uniapp中&#xff0c;可以通过监听触摸事件来判断滑动的方向。常用的触摸事件包括touchstart, touchmove, 和 touchend。通过这些事件的参数&#xff0c;可以计算出用户的滑…

Java 入门指南:Java NIO —— Selector(选择器)

NIO 的引入 在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈&#xff0c;因为需要为每个连接创建一…

随身wifi靠谱吗?适合哪类人使用?靠谱随身wifi怎么选?热门随身wifi推荐测评!

你真的适合用随身wifi吗&#xff1f; 户外工作者&#xff1a;外卖员&#xff0c;滴滴司机&#xff0c;卡车司机&#xff0c;户外直播等人群对于网络的稳定性和流量的需求还是比较高的。随身wifi便携&#xff0c;信号稳定&#xff0c;流量多性价比高的特点符合户外工作者对网络的…