全局异常处理器:解耦合,避免业务层出现大量的try-catch等处理异常的语句,避免冗余。
全局异常处理器的本质
-
对哪些类进行异常处理
-
对哪种异常进行异常处理
全局异常处理器的创建
-
创建该类,指定对哪些类进行异常处理
-
创建异常处理方法,指定对哪种异常进行处理 (以及具体的处理操作)
e.g.
/**
* 全局异常处理器
*/
@ControllerAdvice(annotations = {RestController.class, Controller.class}) // 对所有加了这两个注解的类进行异常处理
@Slf4j
@ResponseBody
public class GlobalExceptionHandler {
/**
* 异常处理方法 (需加上 @ExceptionHandler 注解)
* @return
*/
@ExceptionHandler(Exception.class) // 注解参数表示该方法处理何种异常
public R<String> excepitonHandler(Exception ex){
log.info(ex.getMessage());
log.info(String.valueOf(ex.getClass()));
return R.error("出现异常了!");
}
@ExceptionHandler(ArithmeticException.class)
public R<String> excepitonHandler1(ArithmeticException ex){
log.info(ex.getMessage());
log.info(String.valueOf(ex.getClass()));
return R.error("出现算数异常了!");
}
@ExceptionHandler(ArrayIndexOutOfBoundsException.class)
public R<String> excepitonHandler2(ArrayIndexOutOfBoundsException ex){
log.info(ex.getMessage());
log.info(String.valueOf(ex.getClass()));
return R.error("出现下标越界异常了!");
}
}
注:异常处理方法可定义多个,以处理不同类型的异常。Spring会根据异常类型的接近程度来指定异常处理方法(就近原则)。
出异常时,一般也要把该信息返回给前端(字符串或JSON等方式),因此在该类上还要加一个 @ResponseBody 注解