1 .描述
在j2ee專案的開發中,不管是對底層的資料庫操作過程,還是業務層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預知的、不可預知的異常需要處理。每個過程都單獨處理異常,系統的**耦合度高,工作量大且不好統一,維護的工作量也很大。
那麼,能不能將所有型別的異常處理從各處理過程解耦出來,這樣既保證了相關處理過程的功能較單一,也實現了異常資訊的統一處理和維護?答案是肯定的。下面將介紹使用spring mvc統一處理異常的解決和實現過程。
2
.分析spring mvc處理異常有3種方式:
(1)(2)
實現spring的異常處理介面handlerexceptionresolver 自定義自己的異常處理器;
(3)使用@exceptionhandler註解實現異常處理;
3.實踐
3.1
圖1
優點:經驗證,dao層、service層、controller層丟擲的異常(業務異常busines***ception、引數異常parameterexception和其它的異常exception)都能準確顯示定義的異常處理頁面,
達到了統一異常處理的目標。
缺點:該方法僅能獲取到異常資訊,若在出現異常時,對需要獲取除異常以外的資料的情況不適用
3.2 實現
handlerexceptionresolver
介面自定義異常處理器
圖3
優點:dao層、service層、controller層丟擲的異常(業務異常busines***ception、引數異常parameterexception和其它的異常exception)都能準確顯示定義的異常處理頁面,
達到了統一異常處理的目標
。使用實現handlerexceptionresolver介面的異常處理器進行異常處理,具有整合簡單、有良好的擴充套件性、對已有**沒有入侵性等優點,同時,在異常處理時能獲取導致出現異常的物件,有利於提供更詳細的異常處理資訊
3.3 使用
@exceptionhandler
註解實現異常處理
圖5
圖6優點:dao層、service層、controller層丟擲的異常(業務異常busines***ception、引數異常parameterexception和其它的異常exception)都能準確顯示定義的異常處理頁面,
達到了統一異常處理的目標
。使用@exceptionhandler註解實現異常處理,具有整合簡單、有擴充套件性好(只需要將要異常處理的controller類繼承於basecontroller即可)、不需要附加spring配置等優點
。缺點:
但該方法對已有**存在入侵性(需要修改已有**,使相關類繼承於basecontroller),在異常處理時不能獲取除異常以外的資料。
3.4 未捕獲異常的處理
對於unchecked exception而言,由於**不強制捕獲,往往被忽略,如果執行期產生了unchecked exception,而**中又沒有進行相應的捕獲和處理,則我們可能不得不面對尷尬的404、500……等伺服器內部錯誤提示頁面。
我們需要乙個全面而有效的異常處理機制。目前大多數伺服器也都支援在web.xml中通過(websphere/weblogic)或者(tomcat)節點配置特定異常情況的顯示頁面。修改web.xml檔案,增加以下內容:
圖7
4.
總結
綜合上述可知,spring mvc整合異常處理3種方式都可以達到統一異常處理的目標。從3種方式的優缺點比較,
‚若需要整合的異常處理能夠更具個性化,提供給使用者更詳細的異常資訊,推薦自定義實現handlerexceptionresolver介面的方式; ƒ
若不喜歡spring配置檔案或要實現「零配置」,且能接受對原有**的適當入侵,則建議使用@exceptionhandler註解方式。
Spring 異常處理之全域性處理
承接上文spring異常處理之本地處理,本文介紹spring異常處理的第三種方式,也就是全域性處理。為什麼將該方式取名為全域性處理,其實很簡單,因為該方式本質上和本地處理是一樣的,無非就是本地處理將異常處理方法或者說異常處理邏輯直接寫在controller中,而全域性處理其實就是把本地處理中的異常處...
Spring中全域性異常處理
1 首先我們編寫乙個全域性異常處理的類exceptionhandle,然後再類上加上註解 controlleradvice controlleradvice可以選擇要處理異常的包例如 controlleradvice com.ldd.controlleradvice還可以處理某些註解丟擲的異常例如 ...
筆記之spring全域性異常處理
使用 controlleradvice exceptionhandler 進行全域性的 controller 層異常處理,只要設計得當,就再也不用在 controller 層進行 try catch 了!而且,validated 校驗器註解的異常,也可以一起處理,無需手動判斷繫結校驗結果 bindi...