在web專案開發中,不管是對底層資料庫操作過程,還是業務層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預知的、不可預知的異常處理。每個過程都單獨處理異常,系統的**耦合度高,工作量大且不好統一,維護的工作量也很大。那麼,能不能將所有型別的異常處理從各種處理過程解耦出來,這樣既保證了相關處理過程的功能較單一,也實現了異常資訊的統一處理和維護?
專案全域性的異常統一處理未知。但是springmvc為controller層的異常和資料校驗的異常提供了統一處理方法。整體來看,springmvc異常處理的優缺點如下:
優點:將controller層的異常和資料校驗的異常進行統一處理,減少模板**,減少編碼量,提示拓展性和可維護性。
缺點:只能處理controller層未捕獲(往外拋)的異常,對於intercepter(***)層的異常,spring框架層的異常,就無能為力了。(
下面介紹springmvc的統一異常處理。
springmvc通過handlerexceptionresolver處理程式異常,包括處理器異常、資料繫結異常以及處理器執行時發生的異常。handlerexceptionresolver僅有乙個介面方法:
public inte***ce handlerexceptionresolver
當發生異常時,springmvc會呼叫resolveexception()方法,並轉到modelandview對應的檢視中,作為乙個異常報告頁面反饋給使用者。對於異常處理,一般分為區域性異常處理和全域性異常處理。
區域性異常處理僅能處理指定controller中的異常。
在controller類中新增異常處理方法,方法註解為@exceptionhandler(value="***exception.class"),方法體中可以傳入異常物件和request物件,用於異常處理。處理完成以後的結果,通過modelandview回饋給使用者。當本類中發生時,異常就會被此異常處理方法捕獲,並處理。例如:
@controller
public class usercontroller
return "show";
}//異常的捕獲
/*** 捕獲本類的異常
* 優先順序比全域性異常高
* 針對頁面請求的異常處理,預設返回error.jsp
* 乙個類僅允許存在乙個 @exceptionhandler 標註的方法
* @param ex
* @param request
* @return
*/@exceptionhandler(exception.class)
public modelandview handleexception(exception ex,webrequest request)
}
當訪問127.0.0.1:8080/user/userexception時,方法會丟擲乙個自定義的異常。異常會被handleexception()捕獲並進行處理。最終返回乙個error.jsp的頁面,頁面中包含了異常的型別和資訊:
1.定義異常類
public class myexception extends runtimeexception
public string geterrcode()
public void seterrcode(string errcode)
public string geterrmsg()
public void seterrmsg(string errmsg)
}
2,使用@exceptionhandler+@controlleradvice定義乙個專門做異常處理的類:
@controlleradvice(annotations = controller.class)
public class globalexceptioncontroller
@exceptionhandler(exception.class)
public modelandview handleallexception(exception ex)
}
3,確保spring配置檔案中要能掃到這些bean:
4,controller中可以隨意丟擲異常,不管是自定義異常還是其他異常,異常處理類中的異常處理辦法會起作用。
@controller
public class maincontroller else if("io-error".equals(type)) else
}
使用 @controlleradvice + @exceptionhandler 進行全域性的 controller 層異常處理,只要設計得當,就再也不用在 controller 層進行 try-catch 了!而且,@validated 校驗器註解的異常,也可以一起處理,無需手動判斷繫結校驗結果 bindingresult/errors 了。 spring mvc 異常處理
一般來說,程式每出現乙個異常就需要throws 或者try catch語句塊進行處理,這樣處理異常的方法比較少的情況,還體現不出麻煩,如果需要處理異常的方法比較多的情況下,有乙個統一處理異常方法就顯得尤其重要,即所有丟擲的異常都在乙個方法進行處理,這樣可以集中 簡便,如果需要修改異常處理的方式也比較...
springmvc異常處理
1.異常處理思路 系統中異常包括兩類 預期異常和執行時異常runtimeexception,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範 開發 測試的手段減少執行時異常的發生。系統的dao service controller出現異常都通過throws exception向上丟擲,最後由spr...
SpringMVC異常處理
一 springmvc異常處理流程 預期異常,執行時異常 runtimeexception 前者通過捕獲異常從而獲取異常資訊,後者主要通過規範 開發 測試通過手段減少執行異常的發生。系統的dao service controller 出現都通過throw cetion向上跑出,最後由springmv...