(一)在controller的方法上注解@ExceptionHandler
如果项目中有多个controller文件,通常可以在baseController中实现ExceptionHandler的异常处理,而各个contoller继承basecontroller从而达到统一异常处理的目的
@ExceptionHandler({Exception.class}) //申明捕获那个异常类
public String ExceptionDemo(Exception e) {
//写捕获到异常后要做什么
logger.error(e.getMessage(), e);
return "自定义异常返回";
}
-
优点:ExceptionHandler简单易懂,并且对于异常处理没有限定方法格式;
-
缺点:由于ExceptionHandler仅作用于方法,对于多个controller的情况,仅为了一个方法(指的是ExceptionDemo),所有需要异常处理的controller都继承这个类,明明不相关的东西,强行给他们继承父类,不太好
(二)注解@ControllerAdvice+@ExceptionHandler
单独使用@ExceptionHandler时,其必须在一个Controller中,然而当其与ControllerAdvice组合使用时就完全没有了这个限制。换句话说,二者的组合达到的全局的异常捕获处理。
@ControllerAdvice
@ResponseBody
public class ExceptionAdvice {
@ExceptionHandler(Exception.class)
public Object exceptionAdvice(Exception e) {
HashMap<String, Object> result = new HashMap<>();
result.put("success", -1);
result.put("message", "总的异常信息:" + e.getMessage());
result.put("data", null);
return result;
}
@ExceptionHandler(NullPointerException.class)
public Object nullPointerexceptionAdvice(NullPointerException e) {
//操作
}
}
(三)实现HandlerExceptionResolver接口
HandlerExceptionResolver本身SpringMVC内部的接口,其内部只有resolveException一个方法,通过实现该接口我们可以达到全局异常处理的目的。
public class myHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) {
//捕获到异常的操作
return null;
}
}