SpringMVC的異常處理:
1.加上標籤:
<mvc:annotation-driven></mvc:annotation-driven>
2.在當前Handler(Controller)中定義由@ExceptionHandler註解修飾的方法,用於處理異常信息!
@ExceptionHandler(value={ArithmeticException.class})
public ModelAndView exception(){
ArithmeticException e = new ArithmeticException();
ModelAndView mv=new ModelAndView();
mv.setViewName("error");
mv.addObject("exception", e);
System.out.println("出錯了!");
return mv;
}
注意:
1.@ExceptionHandler方法修飾的入參中可以加入Exception類型的參數,該參數即對應發生的異常信息
2.@ExceptionHandler方法的入參中不能傳入Map.若希望把異常信息傳到頁面上,需要使用ModelAndView作爲方法的返回值。
3.@ExceptionHandler 註解定義的方法優先級問題:
例如發 生的是NullPointerException,但是聲明的異常有 RuntimeException 和 Exception,此候會根據異常的最近 繼承關係找到繼承深度最淺的那個 @ExceptionHandler 註解方法,即標記了 RuntimeException 的方法
4.ExceptionHandlerMethodResolver 內部若找不 到@ExceptionHandler 註解的話,會找@ControllerAdvice 中的@ExceptionHandler 註解方法
基於配置的異常處理:
如果希望對所有異常進行統一處理,可以使用 SimpleMappingExceptionResolver,它將異常類名映射爲 視圖名,即發生異常時使用對應的視圖報告異常
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 指定在在request域中獲取異常信息所需要的key:即ex -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 指定異常映射 -->
<property name="exceptionMappings">
<props>
<!-- 由prop標籤的key屬性指定發生異常的全類名,由值指定出現異常去哪個頁面! -->
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
</bean>
[1]創建異常類:
如果發生異常,會先在異常類中找是否是異常類中標出的這些異常,如果是,則會在異常類中繼續執行下去;反之,則會報異常。
Exception類:
@ControllerAdvice
public class Exception {
@ExceptionHandler(value={ArithmeticException.class,NullPointerException.class})
public ModelAndView exception(){
ModelAndView mv=new ModelAndView();
mv.setViewName("error");
//mv.addObject("exception", e);
System.out.println("出錯了!");
return mv;
}
}
[2]註解異常方法:
發生異常首先找在異常方法中是否標出,如果標出,則會執行異常方法;如果沒有,則會報異常信息。如果異常方法和異常類同時存在,會先找本類中的異常方法,如果本類中的異常方法不能解決這個異常,纔會執行異常類。
Controller類:
異常方法:
@ExceptionHandler(value={ArithmeticException.class})
public ModelAndView exception(){
ArithmeticException e = new ArithmeticException();
ModelAndView mv=new ModelAndView();
mv.setViewName("error");
mv.addObject("exception", e);
System.out.println("出錯了!");
return mv;
}
@RequestMapping(value="/testException")
public String testException(@RequestParam(value="i")Integer i){
System.out.println(10/i);
return "success";
}