1:使用 SpringMvc 中的異常處理器SimpleMappingExceptionResolver
2:使用自定義異常處理器
3:使用異常處理注解
SimpleMappingExceptionResolver
當程序運行過程中出現異常,我們可以讓SpringMvc跳轉到指定的jsp中
1:自定義一個異常
package com.doaoao.myexception; public class MyException extends Exception { public MyException(){ super(); } public MyException(String message){ super(message); } }2:定義一個Controller,在該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; } }3:修改配置文件中的內容 springmvc.xml
<!--異常處理--> <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中的值在瀏覽器中訪問:
http://localhost:8080/_01exception_war_exploded/myException.do?name=hahahhttp://localhost:8080/_01exception_war_exploded/myException.do?name=doaoao
但我們在捕獲異常之前做出處理操作,例如將異常寫入日志文件中,若有多個異常要進行捕獲,者段代碼就會有冗余現象出現
可以通過定義異常處理器來解決該問題,如果發生異常,會自動執行接口中的方法 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