要處理程序發生的異常,首先須要知道異常來自哪裏?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)存儲異常信息
定義一個全局異常處理器