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