一、前言
在 SpringBoot 项目中,对于异常的统一处理,可以采用 Spring 中@ControllerAdvice注解标注的类来统一进行处理,也可以自定义异常处理的解决方案。在 SpringBoot 中,对异常的处理存在一些默认的策略,下面我们就分别来看一下。
默认情况下,SpringBoot项目异常页面如下:

其实通过这个默认的提示页面,能够看出来,之所以能够看到这个默认的异常提示页面,是因为开发者没有提供明确映射路径/error,如果开发者提供了这个路径,则此页面则不会显示,不过在 SpringBoot 项目中提供/error路径实属下下策,为什么这么说?因为 SpringBoot 本身在处理异常时,即当所有条件都不满足时,才会去寻找/error路径,为何要这么复杂,这不是降低效率吗?
现在,先来看看在 SpringBoot 中如何自定义异常页面,就页面属性而言,可以分为两类,一类是静态异常页面,另一类是动态异常页面。
二、静态异常页面
常见的异常可以分为两个派系,分别是 400 系列和 500 系列。自定义异常页面也可以分为两类,一类是以 HTTP 响应码来命名的,例如:402.html、404.html、500.html 等等,另一类则是直接定义一个 4xx.html,状态响应码在 400-499 范围内都显示 4xx.html 异常页面,5xx.html 包含 500-599 范围内的状态响应码都显示 5xx.html 异常页面。
默认情况下,是在classpath:/static/error/下定义异常页面,如下:

【划重点啦】
如果项目中抛出状态码为 500 的错误,则自动展示 500.html 异常页面,若抛出的状态码为 404,则自动展示 404.html 异常页面。如果项目中存在 500.html 页面,同时也存在 5xx.html 页面,若此时发生 500 错误,则优先展示 500.html 页面。这里有个优先级原则:精确 > 模糊。
三、动态异常页面
其实动态异常页面定义与静态异常页面的方式相同,可以采用的模板技术包含:jsp、freemarker、thymeleaf。动态异常页面命名可以是404、500等等精确的状态码命名方式,一般情况下,由于动态异常页面可以直接展示异常详细的信息,所以没有必要挨个枚举了,这里就直接定义为4xx.html、5xx.html。(这里采用的是thymeleaf)
动态异常页面定义如下:

【5xx.html】
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>templates-5xx</h1>
<tr>
<td>path</td>
<td th:text="${path}"></td>
</tr>
<tr>
<td>timestamp</td>
<td th:text="${timestamp}"></td>
</tr>
<tr>
<td>message</td>

本文介绍了在SpringBoot项目中如何处理自定义异常,包括静态异常页面和动态异常页面的创建,以及自定义异常数据和视图。通过分析源码,解释了异常页面的查找规则和优先级:精确匹配优于模糊匹配,动态页面优于静态页面。最后,文章提供了自定义异常数据和视图的方法。
最低0.47元/天 解锁文章
1265

被折叠的 条评论
为什么被折叠?



