使用注解@ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可选属性 value,为一个 Class数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常。
一般把异常处理方法专门定义在一个类中,作为全局的异常处理类。 需要使用注解@ControllerAdvice,字面理解就是“控制器增强”,是给控制器对象增强功能的。
使用@ControllerAdvice 修饰的类中可以使用@ExceptionHandler。 当使用@RequestMapping 注解修饰的方法抛出异常时,会执行@ControllerAdvice 修饰的类中的异常处理方法。
@ControllerAdvice 是使用@Component 注解修饰的,可以扫描到@ControllerAdvice 所在的类路径(包名),创建对象。
1)定义处理异常类
/**
* @ControllerAdvice : 控制器增强(也就是说给控制器类增加功能--异常处理功能)
* 位置:在类的上面。
* 特点:必须让框架知道这个注解所在的包名,需要在springmvc配置文件声明组件扫描器。
* 指定@ControllerAdvice所在的包名
*/
@ControllerAdvice
public class GlobalExceptionHandler {
/*被@ExceptionHandler标记的方法,其返回值可以是 ModelAndView、String,或 void,方法名随意,方法参数可以是 Exception 及其子类对象、HttpServletRequest、HttpServletResponse 等。系统会自动为这些方法参数赋值。*/
@ExceptionHandler
public ModelAndView doOtherException(Exception exception){
ModelAndView mv = new ModelAndView();
return mv;
}
}
2)@ExceptionHandler处理Controller抛出自定义异常类
1、自定义异常类
public class MyException extends Exception {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
2、利用@ExceptionHandler处理Controller抛出的自定义异常类
@ControllerAdvice
public class GlobalExceptionHandler {
//定义方法,处理发生的异常
/*
处理异常的方法和控制器方法的定义一样, 可以有多个参数,可以有ModelAndView,
String, void,对象类型的返回值
形参:Exception,表示Controller中抛出的异常对象。
通过形参可以获取发生的异常信息。
@ExceptionHandler(value = 异常的class):表示异常的类型,当发生此类型异常时,
由当前方法处理
*/
@ExceptionHandler(value = MyException.class)
public ModelAndView myException(Exception exception){
//处理MyException的异常。
/*
异常发生处理逻辑:
1.需要把异常记录下来, 记录到数据库,日志文件。
记录日志发生的时间,哪个方法发生的,异常错误内容。
2.发送通知,把异常的信息通过邮件,短信,微信发送给相关人员。
3.给用户友好的提示。
*/
ModelAndView mv = new ModelAndView();
return mv;
}
}