1. 前言
MVC项目中,为提供友好地用户体验,尽可能全面地记录系统日志,Controller通常捕获业务层异常,避免返回不友好的错误信息。从而,Controller每个方法都是使用模版化的try-catch,处理所有异常,但是导致代码难看维护性差。如下:
try {
......
} catch (Exception e) {
......
} finally {
......
}
使用 @ControllerAdvice + @ExceptionHandler可以统一处理Controller层异常,避免模板化使用try-catch,减少这些不必要的代码维护。
2. 定义全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/*
* 返回json数据或者String数据: 那么需要在方法上加上注解:@ResponseBody 添加return即可。
* 返回视图: 定义一个ModelAndView即可, 然后return;
* 定义视图文件(比如:error.html,error.ftl,error.jsp);
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public Result<?> exceptionHandler(Exception e) {
String msg = e.toString();
logger.error(msg, e);
return (Result<?>)Result.toFail(msg);
}
}
备注:GlobalExceptionHandler应包含在Application启动扫描路径中,才能被正确加载使用。
3. 不足之处
只能处理Controller抛出的异常,对于Interceptor(拦截器)及其他层面的异常,无能为力。