对于一般的MVC项目,大量的异常须要咱们去处理,如此一来,咱们的 Controller 层就不得不进行 try-catch Service 层的异常,这样一来,Controller层每一个方法体都须要写一些模板化的try-catch代码,很是难看且冗余,还很差维护。git
正好这里涉及到两个annotation类: * @ControllerAdvice 全局异常处理类,再也不须要每一个Controller里一必定义 * @ExceptionHandler 定义针对每种类型的Exception 固然啦,若是你在业务中已经try catch啦,那就别期望被处理了,你本身都处理了 别人固然不操心了
全局处理类:github
@ControllerAdvice @ResponseBody public class GlobalExceptionHandler { @Autowired private AppResultManager res;//返回结果包装类 /** * 参数校验失败Handler, 如使用 org.springframework.util.Assert 类校验失败的处理 * * @param request HttpServletRequest * @param exception catch ConstraintViolationException */ @ExceptionHandler(value = IllegalArgumentException.class) public String assertFailHandler(HttpServletRequest request, IllegalArgumentException exception) { return res.error(exception.getMessage()); } //...省略其余方法 /** * 全部异常报错 Handler, 兜底 * * @param request HttpServletRequest * @param exception Exception * @throws Exception 错误 */ @ExceptionHandler(value = Exception.class) public String allExceptionHandler(HttpServletRequest request, Exception exception) { exception.printStackTrace(); return res.error(exception.toString()); } }
测试代码:spring
@RestController @RequestMapping(value = "/helloWorld") public class HelloWorldController { @Autowired private AppResultManager res; @RequestMapping(value = "/test",method = RequestMethod.GET) public String testException(String userName, String callback) { Assert.notNull(userName, "userName can't found"); return res.success(userName, callback); } }
浏览器访问:浏览器
http://localhost:8080/helloWorld/test
优势:将 Controller 层的异常和数据校验的异常进行统一处理,减小模板代码,减小编码量,提高扩展性和可维护性。 缺点:只能处理 Controller 层未捕获(往外抛)的异常,对于 Interceptor(拦截器)层的异常,Spring 框架层的异常,就无能为力了。app
gitHub地址: https://github.com/Grit-tan/globalExceptionDemo框架