今日工作:对自己项目的异常做了下处理,改变以往的try...catch()的模式,直接抛出异常,
交给Spring MVC框架处理,不在单独手动处理。
@ControllerAdvice+ @ExceptionHandler 全局异常处理
对于常用的Spring MVC一类的web项目,总是在业务层进行一些核心业务的操作,数据库的持久
化也是在这一层进行调用,当数据库的操作出现异常的时候,就会抛出,然后事物管理器回滚事务。
那么,那么异常的处理就交给了调用者Controller,传统的try...catch模式又来了,这一套很烦,有没有?
每次都把代码弄得不整洁了,而且这层代码也是很冗余的。
例如:下面Controller层代码(伪代码)
try { // 1、执行数据检验 Utils.validate(errors); // 2、执行业务 xxxService.login(); // 3、数据返回 } catch (Exception e) { log.debug("error---"+e.getMessage()); e.printStackTrace(); }
所以避开这类代码就显得尤为重要,下面就来说说@ControllerAdvice+@ExceptionHandler处理异常的神奇之处了。
1、局限性
我们知道每种技术都有其局限性,那么这种方式的优缺点是什么呢?
1)优点:不得不说这是Spring MVC最好的解决方案,减少了Controller的代码量,整洁代码,同时也可以很方便的
管理代码,利于维护吧!
2)缺点:不能处理框架级别的异常,例如Spring抛出的异常
2、简单的一个例子
2.1 加上全局异常处理注解:@ControllerAdvice
/** * 全局异常处理---需要注意扫包该类被扫描 */ @ControllerAdvice @ResponseBody public class GlobalException {}
这个被注解的异常处理类,需要被Spring扫包扫到,不然无法提供服务。
2.2 定义全局处理方法:@ExceptionHandler
/** * 全局异常的处理方法 * @param ex * @return */ @ExceptionHandler(Exception.class) public String executeException(Exception ex) { }
被@ExceptionHandler注解的方法可以处理不同的异常,前提是在直接中写入需要捕获的异常类型,
当程序抛出了该类异常,就会被处理,这里大家可以试试自定义异常,很方方便的可以统一处理异常
信息。
这个时候,就可以对Controller层的try...catch()说拜拜了。
问题:当时是在每一个Handler中加入@ExceptionHandler的注解方法来处理异常信息,导致代码又多
了很多的重复代码。
解决:做全局统一的异常就可以解决了,只需要写一个类即可。
明日计划:明日计划完成Spring MVC登录拦截器