Spring MVC處理異常
Spring MVC異常
Spring MVC處理異常的介面 HandlerExceptionReslover介面,實現類:ExceptionHandlerExceptionResolver ,主要提供了@ExceptionHandler註解,並通過該註解處理異常
處理異常的方式
1、實現HandlerExceptionResolver介面
2、單獨使用@HandlerException註解
3、使用@ControllerAdvice + @HandlerException
1、實現HandlerExceptionResolver介面
package com.xingwei.handler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; public class MyException implements HandlerExceptionResolver{ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println(ex.getMessage()); //檢視具體的異常資訊 ModelAndView modelAndView = new ModelAndView() ; modelAndView.setViewName("/error.jsp"); return modelAndView; } }
這種實現介面的方式需要在SpringMVC配置檔案中注入bean
<bean id="myException" class="com.xingwei.handler.MyException"></bean>
2、使用@ExceptionHandler註解
基於介面的實現類:ExceptionHandlerExceptionResolver,主要提供了@ExceptionHandler註解,並且通過該註解來處理異常
//該方法 可以捕獲本類中 丟擲的ArithmeticException異常 @ExceptionHandler({ArithmeticException.class,ArrayIndexOutOfBoundsException.class }) public String handlerArithmeticException(Exception e) { System.out.println(e +"============"); return "error" ; }
缺點:
@ExceptionHandler預設只能處理當前類的異常,不能處理其他類的異常
使用@ExceptionHandler進行處理有一個不好的地方是進行異常處理的方法必須與出錯的方法在同一個Controller裡面
3、@ControllerAdvice + @ExceptionHandler
這也是 Spring 3.2 帶來的新特性。從名字上可以看出大體意思是控制器增強。 也就是說,@controlleradvice + @ ExceptionHandler 也可以實現全域性的異常捕捉。
package com.xingwei.handler; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; @ControllerAdvice //不是控制器,只是用於處理異常的類 public class MyExceptionHandler { @ExceptionHandler({Exception.class}) public ModelAndView testMyException(ArithmeticException e) { ModelAndView mv = new ModelAndView("error"); //轉發到error頁面 mv.addObject("e", e) ; System.out.println(e +"=============="+"@ControllerAdvice中處理異常的方法,可以用於處理任何類的異常"); return mv ; } }
注意點
@ExceptionHandler標識的方法的引數,必須在異常型別(Throwable或其子類,後面不能跟其他引數,比如ModelAndView,結果我個人大量嘗試,可以加Model) ,不能包含其他型別的引數
參考:https://blog.csdn.net/qq_36951116/article/details/79976414
總結
-
@ControllerAdvice 不是控制器,只是用於處理異常的類
-
@ExceptionHandler預設只能處理當前類的異常,不能處理其他類的異常,
-
如果發生異常的方法和處理異常的方法不在同一個類中,則預設不會處理,如果想要處理,則需要增加一個註解 @ControllerAdvice