1:使用 SpringMvc 中的異常處理器SimpleMappingExceptionResolverjava
2:使用自定義異常處理器web
3:使用異常處理註解spring
SimpleMappingExceptionResolver數組
當程序運行過程當中出現異常,咱們能夠讓SpringMvc跳轉到指定的jsp中瀏覽器
1:自定義一個異常mvc
package com.doaoao.myexception; public class MyException extends Exception { public MyException(){ super(); } public MyException(String message){ super(message); } }2:定義一個Controller,在該Controller中拋出自定義異常和系統異常app
package com.doaoao.controller; import com.doaoao.myexception.MyException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ExceptionController { @RequestMapping("/myException.do") public ModelAndView myException(String name)throws Exception{ ModelAndView mv = new ModelAndView(); if("doaoao".equals(name)){ throw new MyException("拋出自定義異常"); } if(!"doaoao".equals(name)){ throw new Exception("系統異常"); } return mv; } }3:修改配置文件中的內容 springmvc.xml jsp
<!--異常處理--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="com.doaoao.myexception.MyException">error/MyError</prop> </props> </property> <property name="defaultErrorView" value="error/error"/> <property name="exceptionAttribute" value="ex"/> </bean> <!-- 配置中內容說明 --> <property name="exceptionMappings"> <props> <prop key="com.doaoao.myexception.MyException">error/MyError</prop> </props> </property> 1:key="com.doaoao.myexception.MyException":指定異常的全名,值爲當發生異常時響應的路徑名稱 2:error/MyError:當發生異常時響應的jsp路徑,若是配置視圖解析器,會使用視圖解析器中的目錄和後綴 3:<property name="defaultErrorView" value="error/error"/>:指定默認異常響應頁面,當發生的異常不是 exceptionMappings中定義的異常時,則使用默認異常響應頁面 4:<property name="exceptionAttribute" value="ex"/>:捕獲到的異常對象,該對象通常用於響應的頁面中使用,
可在響應頁面利用el表達式獲取value中的值在瀏覽器中訪問:ide
http://localhost:8080/_01exception_war_exploded/myException.do?name=hahahhttp://localhost:8080/_01exception_war_exploded/myException.do?name=doaoao
但咱們在捕獲異常以前作出處理操做,例如將異常寫入日誌文件中,如有多個異常要進行捕獲,者段代碼就會有冗餘現象出現spa
能夠經過定義異常處理器來解決該問題,若是發生異常,會自動執行接口中的方法 resolveException()
1:定義Controller類(與上方代碼相同)
package com.doaoao.controller; import com.doaoao.myexception.MyException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ExceptionController { @RequestMapping("/myException.do") public ModelAndView myException(String name)throws Exception{ ModelAndView mv = new ModelAndView(); if("doaoao".equals(name)){ // 處理相關操做 throw new MyException("拋出自定義異常"); } if(!"doaoao".equals(name)){ // 處理相關操做 throw new Exception("系統異常"); } return mv; } }2:定義異常處理器
package com.doaoao.myexception; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mv = new ModelAndView(); mv.addObject("ex", e); // 默認處理頁面 mv.setViewName("error/error"); // 判斷e是不是MyException if (e instanceof MyException) { // 處理捕獲異常後的操做 // 設置跳轉頁面 mv.setViewName("error/MyError"); } return mv; } }3:修改配置文件 springmvc.xml
<bean class="com.doaoao.myexception.MyExceptionResolver"/>
使用註解 @ExceptionHandler 能夠將一個方法指定爲異常處理方法,該註解具備一個參數爲value,value的值爲一個Class數組,Class數組用於指定處理異常的類,當Controller中拋出的異常在這個Class數組中的時候纔會調用該異常處理方法
而被註解的異常處理方法,其返回值能夠是 ModelAndView、String,或 void,方法名隨意,方法參數能夠是 Exception 及其子類對象、HttpServletRequest、HttpServletResponse 等。系統會自動爲這些方法參數賦值
package com.doaoao.controller; import com.doaoao.myexception.MyException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ExceptionController { @RequestMapping("/myException.do") public ModelAndView myException(String name)throws Exception{ ModelAndView mv = new ModelAndView(); if("doaoao".equals(name)){ // 當拋出 MyException 時會被下方定義的 handlerException 處理 throw new MyException("拋出自定義異常"); } if(!"doaoao".equals(name)){ throw new Exception("系統異常"); } return mv; } @ExceptionHandler(MyException.class) public ModelAndView handlerException(Exception ex){ ModelAndView mv = new ModelAndView(); mv.addObject("ex", ex); mv.setViewName("/error/MyError"); return mv; } }
# 當Controller中拋出異常爲 MyException 時會被方法 handlerException 處理,但若是其它的Controller中拋出異常 MyException 時不會被該方法受理的,解決該問題的方法就是定義一個單獨處理異常方法的Controller,而後讓其它的Controller繼承該 Controller,但繼承是單繼承的,繼承了該Controller就不能在繼承其它的
1:定義一個基類
package com.doaoao.controller; import com.doaoao.myexception.MyException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** * 異常處理基類 */ @Controller public class ExceptionController { // 處理MyException異常的方法 @ExceptionHandler(MyException.class) public ModelAndView handleMyException(Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("ex", ex); mv.setViewName("/error/MyError"); return mv; } // 其餘異常處理,註解中不用寫value屬性(默認) @ExceptionHandler public ModelAndView handleException(Exception ex) { ModelAndView mv = new ModelAndView(); mv.addObject("ex", ex); mv.setViewName("/error/error"); return mv; } }2:定義Controller 繼承 ExceptionController
@Controller @RequestMapping("/user") public class newController extends ExceptionController { @RequestMapping("/addUser.do") public ModelAndView addUser(Exception ex,String name) throws Exception{ ModelAndView mv = new ModelAndView(); if ("doaoao".equals(name)) { throw new MyException("拋出自定義異常"); } return mv; } }...
本筆記參考自:小猴子老師教程 http://www.monkey1024.com