1. 程式人生 > >SpringMvc的異常處理

SpringMvc的異常處理

成功 配置 exce eth except setview work 問題 class

首先在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 public
String 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

方法的入參中不能傳入Map,也不能使用model。若希望把異常信息傳到頁面上,需要使用ModelAndView作為方法的返回值。

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

優先級問題

①當有兩個異常處理時,優先走精確的,例如上面定義了異常,

ArithmeticExceptionException

當發生ArithmeticException異常時,會優先走ArithmeticException的處理方法,輸出

ExceptionHandler====ArithmeticException=======

②如果在上面定義的方法中,將ArithmeticException.class改為RuntimeException.class,也就是聲明了 RuntimeExceptionException,此時在發生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的異常處理