Spring3.0中對異常的處理方法一共提供了兩種:一種是使用HandlerExceptionResolver接口;一種是在Controller類內部使用@ExceptionHandler註解。使用第一種方式能夠實現全局異常控制,而且Spring已經提供了一個默認的實現類SimpleMappingExceptionResolver;使用第二種方式能夠在Controller內部實現更個性化點異常處理方式,靈活性更高。通常來講,項目中只須要採用第一種方式就能夠了,每一個人都本身定義異常的展示方式,太過個性了,不統一。html
從目前的調查結果看,這兩種方式不能共存,不知道將來的版本是否能將他們合二爲一,這樣才能靈活配置。java
使用這種方式只須要實現resolveException方法,該方法返回一個ModelAndView對象,在方法內部對異常的類型進行判斷,而後常見合適的ModelAndView對象,若是該方法返回了null,則Spring會繼續尋找其餘的實現了HandlerExceptionResolver 接口的Bean。換句話說,Spring會搜索全部註冊在其環境中的實現了HandlerExceptionResolver接口的Bean,逐個執行,直到返回了一個ModelAndView對象。web
示例代碼:spring
這個類必須聲明到Spring中去,讓Spring管理它,你可使用@Component標籤,也可使用<bean/>節點。爲了簡單的進行異常處理,Spring提供了SimpleMappingExceptionResolver類,該類實現了HandlerExceptionResolver接口,須要使用時只須要使用<bean/>節點進行聲明便可,示例以下:sql
一個典型的異常顯示頁面以下:
<html>
<head><title>Exception!</title></head>
<body>
<% Exception ex = (Exception)request.getAttribute("exception"); %>
<H2>Exception: <%= ex.getMessage();%></H2>
<P/>
<% ex.printStackTrace(new java.io.PrintWriter(out)); %>
</body>
</html>
exception 實在SimpleMappingExceptionResolver 被存放到request中的,具體能夠查看源代碼。
若是SimpleMappingExceptionResolver沒法知足異常處理的須要,咱們能夠針對
HandlerExceptionResolver接口實現本身異常處理類,這一樣很是簡單(只須要實現一個
resolveException方法)。
若是有ViewResolver,則制定的jsp頁面必須在那個頁面下,到時候若是找不到頁面,能夠根據錯誤提示再調整頁面路徑app
該方法須要定義在Controller內部,而後建立一個方法並用@ExceptionHandler註解來修飾用來處理異常,這個方法基本和 @RequestMapping修飾的方法差很少,只是能夠多一個類型爲Exception的參數,@ExceptionHandler中能夠添加一個或多個異常的類型,若是爲空的話則認爲能夠觸發全部的異常類型錯誤。jsp
示例代碼:ide