一:概述
Spring MVC提供的統一全局異常處理能夠很好解決異常信息直接返回的尷尬以及異常頁面統一的問題。Spring Mvc提供了四種內置的異常處理實現,當然也可以自定義擴展實現異常處理,對於某些HTTP異常狀態碼web.xml中也可以針對狀態碼配置異常頁面等
二:SimpleMappingExceeptionResolver
該異常處理實現是將異常類型與異常頁面進行綁定處理,可以配置某種異常拋出時跳轉特定的頁面
2.1 配置詳解
屬性 | 類型 | 作用 | 備註 |
---|---|---|---|
order | Integer | 處理器執行順序 | |
defaultErrorView | String | 默認所有異常跳轉頁面 | 處理的是沒有特定配置的異常 |
exceptionAttribute | String | 異常頁面中獲取異常對象的key | 默認exception |
exceptionMappings | Propers | 定義需要綁定特定異常頁面的異常類型 | |
excludedExceptions | Class[] | 該異常處理器不處理的異常 | |
defaultStatusCode | Integer | 異常處理器處理異常後返回HTTP請求的狀態碼 | 默認是200 |
statusCodes | Map<String,Integer> | 綁定某個異常頁面的HTTP請求狀態碼 | key指定異常頁面名字,value指定狀態碼 |
2.2 異常處理測試
SpringMVC配置文件中注入SimpleMappingExceeptionResolver實例,設置默認異常頁面error.jsp,針對非法訪問異常綁illegalAccess.jsp頁面,不處理空指針異常,異常對象頁面獲取key爲ex
控制層提供三個處理器,分別拋出空指針、非法狀態、類轉換異常。瀏覽器訪問結果如下,符合配置需求
2.3 頁面狀態碼測試
默認異常頁面狀態碼爲5000,當跳轉到非法訪問異常頁面時狀態碼爲6000
測試異常處理器處理類轉換異常與非法訪問異常,查看狀態返回碼符合配置
2.4 執行順序測試
配置兩個異常處理器,order執行順序分別爲1、2,通過跳轉不同的異常頁面判定異常處理器執行。當發生空指針異常時兩個異常處理器都能執行,最後跳轉頁面爲order屬性爲1的非法訪問異常頁面。結論就是order屬性越小,異常處理器執行順序越高
三:DefaultHandlerExceptionResolver
用以處理SpringMVC標準異常,將標準異常輸出匹配HTTP標準狀態碼。比如當控制層定義支持請求類型爲POST,發送GET請求,SpringMVC中將拋出HttpRequestMethodNotSupportedException。這時候異常處理器DefaultHandlerExceptionResolver就能捕獲異常並進行處理,其處理源碼示意如下
Response輸出異常,異常狀態碼SC_METHOD_NOT_ALLOWED是在HttpServletResponse中定義常量405
四:ResponseStatusExceptionResolver
該異常處理器與DefaultHadlerExceptionResolver異常處理器一致,都是SpringMVC默認會裝載的異常處理器。作用在於與@ResponseStatus註解配合,將註解中映射的HTTP狀態碼與異常描述輸出到前端
五:ExceptionHandlerExceptionResolver
配合註解@ExceptionHandler使用的異常處理器,註解@ExceptionHandler限制要求必須與拋出異常方法在同一個類中才能生效,比較尷尬。結果就是每個類中都需要這麼一個註解的方法,反正我不喜歡用這個異常處理,感興趣可以自行Google
六:自定義異常處理
前面講解的四個SpringMVC異常處理器實現都是HandlerExceptionResolver接口實現類,如果某些異常需要自定義邏輯處理則可以自行實現該接口定義異常處理器。該接口就一個方法resolveException(),該方法中重寫異常處理邏輯
6.1 自定義異常處理器
6.2 測試自定義異常處理器
七:web.xml定義
當最終異常拋出到WEB容器中都未做任何處理的時候就可以在web.xml中配置定義異常頁面,當然這裏配置可以根據HTTP狀態碼亦或是異常進行配置。當請求拋出空指針異常會執行哪個error-page?根據作者的測試是當異常拋出會首先檢查是否有定義<exception-type>,如果沒有再根據Httpstatus進行處理