要处理程序发生的异常,首先须要知道异常来自哪里?html
1.前端错误的的请求路径,会使得程序发生4xx错误,最多见的就是404,Springboot默认当发生这种错误的请求路径,pc端响应的页面以下前端
若是是移动端(手机端)将会响应json格式的数据,以下java
为何咱们请求错误的路径,boot会给咱们返回一个上面错误页面或者json格式数据呢?原理是怎样的呢?
react
Springboot项目启动以后,执行有@SpringBootApplication注解的启动类的main方法,经过@EnableAutoConfiguration加载web
springbootAutoConfiguration.jar包下的META-INF/spring.factories中的全部配置类(这些配置类加载以后,会将每一个配置类里面的组件注入容器而后使用)其中一个自动配置spring
ErrorMvcAutoConfiguration,经过代码能够看到用到了如下四个组件json
DefaultErrorAttributes、BasicErrorController、errorPageCustomizer、DefaultErrorViewResolver后端
其余三个基本相似,当出现4xx或者5xx等错误时,errorPageCustomizer就会生效,this.properties.getError().getPath())并来到/error请求,核心代码springboot
而这个/error请求再由BasicErrorController处理,BasicErrorController是一个Controller,其中里面有两种处理方法,一种是HTML形式,服务器
一种是JSON格式。其中访问者的信息能够从getErrorAttributes从获取。DefaultErrorAttributes是ErrorAttributes的实现类。
关键代码
当为HTML模式时,就会构建一个resolveErrorView类,而resolverErrorView继续调用ErrorViewResolver。关键代码
在咱们没有作自定义配置时,ErrorViewResolver就会指向DefaultErrorViewResolver。
明白了boot处理异常机制,咱们如何自定义异常响应规则呢?
若是项目中有模板引擎(jsp,thmeleaf,freemarker)的状况下,能够将错误页面命名为状态码.html放在模板引擎文件夹下的error文件夹下,
发生异常,无论是前端请求仍是后端程序错误会来到对应的错误页面。能够将错误页面命名为4xx和5xx匹配全部的错误,
可是优先返回精确状态码.html页面;而且在模板引擎页面能够获取以下相关信息
这里模版引擎使用thmeleaf
4xx代码
咱们在程序代码中人为制造一个异常,请求响应
上面是有模版引擎的状况下处理错误以及异常的方式,
若是项目中没有模板引擎,(模板引擎找不到这个错误页面),静态资源文件夹static下找对应的4xx或者5xx或者更精确的错误页面。可是若是不用模板引擎,页面不能获取上面说的页面信息;
上面两种方式使用手机访问返回都是boot默认的json数据
上面第一种能够轻松的的处理异常,只需在指定的路径下放静态页面(无模版引擎的状况)或者携带相关信息的页面(有模版引擎),
缺点就是不能在页面携带咱们想要展现的数据,好比当咱们程序某处放生异常,咱们要返回咱们本身提示的错误信息。这种异常若是处理呢?
默认状况下,在 Spring Boot 中,全部的异常数据其实就是第一种所展现出来的 5几条数据,这些数据定义在 org.springframework.boot.web.reactive.error.DefaultErrorAttributes 类中,具体定义在 getErrorAttributes 方法中 :核心代码以下
DefaultErrorAttributes 类自己则是在 org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration 异常自动配置类中定义的,
若是开发者没有本身提供一个 ErrorAttributes 的实例的话,那么 Spring Boot 将自动提供一个 ErrorAttributes 的实例,也就是 DefaultErrorAttributes 。
基于此 ,开发者自定义 ErrorAttributes 有两种方式 实现自定义数据:
1.直接实现 ErrorAttributes 接口
2.继承 DefaultErrorAttributes(推荐),由于 DefaultErrorAttributes 中对异常数据的处理已经完成,开发者能够直接使用。
咱们服务器访问 错误路径
客户端响应
访问有异常的的控制器
客户端响应
固然上面我能够在程序任意位置抛出异常,使用全局异常处理器处理
自定义异常
全局异常处理器
自定义ErrorAttributes
这种方式主要是针对先后端分离的项目,咱们自定义一个异常,在程序中用于抛出
定义一个返回结果对象(也能够不用定义,直接使用map)存储异常信息
定义一个全局异常处理器