故事的開始是這個樣子的。在一個慵懶的午後,閒的蛋疼的一天裏我在測試着接口,而後我就看到了以下畫面 ,它們是這樣的還有這樣的:html
很顯然這是當應用發生錯誤時候的提示。很不巧的是公司的項目最近好像常常出現各類奇怪的錯誤異常信息,可是開發人員卻因爲不能快速的定位問題而一臉懵逼的樣子。因而乎我決定是時候把這個異常處理好好給搞一下了(整點自定義啥的讓信息更詳細)。 在搞了一段時間後,終於這篇博客是時候誕生了(老妹兒 法克兒 ***** )。
spring
若是有人說經過 @ExceptionHandler 來進行處理那也沒錯 ,不過我在這裏要說的是另一種方式那就是當發生異常後,將這個 Request forward 到一個錯誤處理的接口上去 , 默認是 /error . Spring Boot 提供了一個默認的 BasicErrorController 來處理這個 /error 接口的請求 。一個方法處理響應 json 格式數據, 另外一個函數響應一個 html 頁面,也就是咱們前面看到的那個不能再糊弄事的 Whitelabel Error Page 。apache
那麼看到這個代碼我就又產生了一個疑問,這個名字叫作 error 的試圖是定義在哪裏呢 ? 剛開始的時候我覺得是 spring boot 包內部的一個 jsp 或者 html 頁面什麼的,而後我就開始搜索 ...... 最後沒找到。通過 debug 查看源碼後我發現了這個東西 :ErrorMvcAutoConfiguration , 裏面有一個 WhitelabelErrorViewConfiguration 裏面還有一個 SpelView 。就是它了,名稱叫 error 的視圖,顯然這個咱們是能夠覆蓋的只要咱們本身再聲明一個 bean 名稱爲 error 就好了。 json
固然看到這裏我大體知道了 spring boot 是如何經過 /error 接口來處理異常的。可是仍是以爲心理空落落的 ,感受仍是少了點什麼。對了我以前說過了有異常後就會把當前 Request forward 到 /error 這個接口上 , 對了我如今想知道就是在什麼地方進行 forward 的 。tomcat
老實說這個問題的答案我仍是找了一會的。 最後我發現不是在 Spring 中作的這個 forward 操做。必須提早聲明下個人項目用的是內嵌的 tomcat ,至於其餘類型的容器這篇博客可能並不適用。 forward 到 /error 的操做是在 tomcat 的 org.apache.catalina.core.StandardHostValve 中進行的。
jsp