在web开发中的异常错误处理
SpringBoot默认有一套对web开发错误处理的机制,在autoConfiguration
包下面找到了ErrorMvcAutoConfiguration
。
1 |
|
处理机制
在这个自动配置类中,由三个最基本的bean
组件组成,下面挨个看这些注入到容器中的bean
的含义
errorPageCustomizer
定义错误页面
1 |
|
所以errorPageCustomizer
的主要功能就是找到地址,拼装成ErrorPage
;
WhitelabelErrorViewConfiguration
空白页的配置
1 | protected static class WhitelabelErrorViewConfiguration { |
basicErrorController
控制器
basicErrorController就是简单的控制器
1 | //controller实现 注册到容器中 |
在这个Controller
中映射到了/error
地址上,有具有两个RequestMapping
进行映射。
请求的媒体类型为text/html
时
1 | (produces = MediaType.TEXT_HTML_VALUE) |
其中使用夫类中的getErrorAttributes
方法来获取基本属性数据,通过return this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace)
直接调用已经注入到容器中的ErrorAttributes
类及其子类。如默认的DefaultErrorAttributes
。
1 |
|
在获取完需要返回的数据之后,返回一个modelAndView
对象,也就是一个带有显示的界面。
默认使用DefaultErrorViewResolver
来进行对ErrorView
的解析。
1 |
|
如果没有通过resolve方法找到一个modelAndView。则会有类似通过 5xx.html
页面来展示5开头的那些错误的页面。可选值有下面两种:
1 | views.put(Series.CLIENT_ERROR, "4xx"); |
1 | // 使用resolve方法来获取ModelAndView |
如果到上一步仍不存在view则说明,模版引擎/基本资源文件夹下均不存在error文件夹下的xxx.html文件,则会返回一个默认的view 。(modelAndView != null) ? modelAndView : new ModelAndView("error", model);
,就是在标题【WhitelabelErrorViewConfiguration】中提及到的StaticView。
请求为其他媒体类型
1 |
|
errorAttributes
错误页面属性信息
1 |
|
这个bean主要是使用getErrorAttributes
提供ErrorController
返回值的信息,如果状态码等。。如果想更改错误信息的返回值内容,可以继承DefaultErrorAttributes
,然后在getErrorAttributes
方法里添加想要添加的内容即可。
添加错误页面和修改返回信息
下面具体来根据SpringBoot特性来添加错误页面,如404,500等。
因为在处理机制这章里说明了SpringBoot如何处理错误,他会默认的访问/error/地址,并且如果是text/html的媒体类型,也就是网页访问的话,如果有模版引擎,他会去找在/error
文件中对应编码的xxx.html
页面进而去渲染这个页面。
比如访问404,他会去找classpath:/error/404.html
页面去渲染,如果没有,他会去找classpath:/error/4xx.html
,如果还没有,他会返回一个页面。
添加error页面
为了演示,创建404.html
和4xx.html
,来达到这样的目的:如果发生404错误,则访问404.html页面,如果发生402或者以4开头的错误,则访问4xx.html页面。
目录结构和示例内容参考如下:
定义异常和对应的异常处理
1 | public class NoAuthException extends RuntimeException { |
定义自定义属性类
1 |
|
通过以上的设置,可以得到如下结果:
- 如果是 /hello?name=abc的时候抛出NoAuthException异常 跳转到4xx页面
- 如果是 /hello?name=123的时候抛出NoUserExcetion的异常 跳转到404页面
- 如果没有访问地址也会到404页面
测试结果
- 访问/hello?name=abc 跳转到4xx页面
- 访问/hello?name=123 跳转到404页面
结论
在考虑对web错误页面处理的角度,无非就是两个方面:
一、 页面样式
在有模版引擎的情况下,通过DefaultErrorController
在/error
上的访问处理,来自动渲染在template/error/
目录下的对应的错误code.html
的的展示,如404.html。并且支持模糊匹配,如创建4xx.html页面,那么如果没有发现特定的错误代码页面,则自动的使用4xx页面。
二、 页面内容
页面内容可以通过继承DefaultErrorAttributes
类来进行简单的实现,如果想全部替换掉SpringBoot的默认全部的返回内容,则需要实现ErrorAttributes
进行实现,需要注意的是必须放到容器中才能生效。