SpringMvc的異常處理
首先在SpringMVC中加上<mvc:annotation-driven>標簽:
<mvc:annotation-driven></mvc:annotation-driven>
新建一個error.jsp頁面
1、基於註解的異常處理
(1)@ExceptionHandler註解
在當前Handler中定義由@ExceptionHandler註解修飾的方法,用於處理當前Handler中的異常信息!
在Handler中定義如下方法:
1 @ExceptionHandler(value={ArithmeticException.class}) 2 publicString handleException(){ 3 System.out.println("ExceptionHandler====ArithmeticException======="); 4 return "error"; 5 } 6 @ExceptionHandler(value={Exception.class})//value為對應的異常信息,異常的字節碼文件,可定義多個 7 public String handleException1(){ 8 System.out.println("ExceptionHandler====ArithmeticException=======");9 return "error"; 10 } 11 @RequestMapping(value="/test",method=RequestMethod.GET) 12 public String testException(@RequestParam(value="i") Integer i){ 13 int j= 10/i; 14 return "success"; 15 }
成功則返回success.jsp,失敗則返回error.jsp
註意:
①@ExceptionHandler方法修飾的入參中可以加入Exception類型的參數,該參數即對應發生的異常信息
②@ExceptionHandler
1 @ExceptionHandler(value={ArithmeticException.class}) 2 public ModelAndView handleException(Exception ex){ 3 System.out.println("ExceptionHandler====ArithmeticException======="); 4 ModelAndView mv=new ModelAndView(); 5 mv.addObject("ex", ex); 6 mv.setViewName("error"); 7 return mv; 8 }
在error.jsp頁面用${ex }獲取返回值。java.lang.ArithmeticException: / by zero
優先級問題
①當有兩個異常處理時,優先走精確的,例如上面定義了異常,
ArithmeticException和Exception
當發生ArithmeticException異常時,會優先走ArithmeticException的處理方法,輸出
ExceptionHandler====ArithmeticException=======
②如果在上面定義的方法中,將ArithmeticException.class改為RuntimeException.class,也就是聲明了 RuntimeException 和 Exception,此時在發生ArithmeticException時,
會根據異常的最近繼承關系找到繼承深度最淺的那個,也就是會走 RuntimeException 的異常處理方法。
註:(如果將ArithmeticException換成NullPointerException,此時在發生ArithmeticException時,會走Exception的處理方法,和繼承深度有關系,沒理解好)
(2)@ControllerAdvice註解
自定義Handler類,所有的Handler類出現的異常都會經過此類中的方法
1 @ControllerAdvice 2 public class MyException { 3 @ExceptionHandler(value=Exception.class) 4 public String HandleException(){ 5 System.out.println("ControllerAdvice====Exception======="); 6 return "error"; 7 } 8 @ExceptionHandler(value={ArithmeticException.class}) 9 public String handleException(){ 10 System.out.println("ControllerAdvice====ArithmeticException======="); 11 return "error"; 12 } 13 }
需要註意的問題和優先級問題與(1)中一樣。
另外需要註意的是:當兩種情況(1)(2)並存時,發生異常會優先走本類中的異常處理方法。
2、基於配置的異常處理
如果希望對所有異常進行統一處理,可以使用 SimpleMappingExceptionResolver,它將異常類名映射為視圖名,即發生異常時使用對應的視圖報告異常
在springmvc中配置
1 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 2 <!-- 指定在在request域中獲取異常信息所需要的key:即ex,默認是exception --> 3 <property name="exceptionAttribute" value="ex"></property> 4 <!-- 指定異常映射 --> 5 <property name="exceptionMappings"> 6 <props> 7 <!-- 由prop標簽的key屬性指定發生異常的全類名,由值指定出現異常去哪個頁面! --> 8 <prop key="java.lang.ArithmeticException">error</prop> 9 </props> 10 </property> 11 </bean>
在error.jsp頁面用${ex }可以獲取到異常名。java.lang.ArithmeticException: / by zero
基於註解比基於配置優先級高。
SpringMvc的異常處理