介绍
今天就跟大家聊聊有关弹簧引导中怎么对异常进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
先谈谈“异常处理”这件事。下面有2份伪代码,对比下:
//①基于if/else判断 如果(deletePage(页面)==E_OK) { 如果(registry.deleteReference (page.name)==E_OK) { 如果(configKeys.deleteKey (page.name.makeKey ())==E_OK) { logger.log (“deleted"页); 其他}{ logger.log (“configKey不是deleted"); } 其他}{ logger.log(“从注册表failed" deleteReference); } 其他}{ logger.log(“删除failed"); 返回E_RROR; }
//②基于异常处理 尝试{ deletePage(页面); registry.deleteReference (page.name); configKeys.deleteKey (page.name.makeKey ()); }捕捉(异常e) { logError (e); }
可以看的出,如果使用异常替代返回错误码,错误处理代码就能从主路径逻辑中分离出来,得到简化!
②中,基于异常处理的代码真的好吗?其实是丑陋不堪的,它搞乱了代码结构,把错误处理与正常流程混为一谈。最好把try和catch代码块的主体部分抽离出来,形成另外的函数。
//③优雅的异常处理逻辑 公共空间删除页面(页面){ 尝试{ deletePageAndAllReferences(页面); }捕捉(异常e) { logError (e); } } 私人空间deletePageAndAllReferences页面(页面){抛出异常 deletePage(页面); registry.deleteReference (page.name); configKeys.deleteKey (page.name.makeKey ()); } 私人空间logError(异常e) { logger.log (e.getMessage ()); }
③中,函数各司其职,更易于理解和修改了。
总结:使用异常而不是错误码,优雅地使用异常!函数应该只做一件事,处理错误就是一件事,因此,处理错误的函数不该做其他事!
<强>在春天引导中处理异常强>
<强> 1,默认的异常处理强>
例如401404500年5 xx等异常,弹簧引导默认会跳转到预配置的页面,此处以thymeleaf模板引擎为例:
/* * *统一响应 * @author anoy */公开课ResponseBean{ 私人int代码; 私人字符串消息; 私人T数据; 公共ResponseBean () {} 公共ResponseBean (ExceptionEnum ExceptionEnum) { 这一点。代码=exceptionEnum.getCode (); 这一点。消息=exceptionEnum.getMessage (); }//省略setter和getter }
/* * *异常类型枚举 * @author anoy */公共enum ExceptionEnum { GIRL_FRIEND_NOT_FOUND(100000年,“女朋友不是found"); 私人int代码; 私人字符串消息; ExceptionEnum (int代码字符串消息){ 这一点。代码=代码; 这一点。消息=消息; } 公共int getCode () { 返回码; } 公共字符串getMessage () { 返回消息; } }
今天七夕,写个GirlFriendNotFoundException(很有同感,是不是?)
@ controller 公开课用户控件{ @RequestMapping(“/朋友/{id}“) 公共字符串的朋友(@PathVariable (“id")长id)抛出GirlFriendNotFoundException { 如果(id==1 l) { 把新GirlFriendNotFoundException (); } 返回“朋友”; } @ExceptionHandler (GirlFriendNotFoundException.class) @ResponseBody 公共ResponseBean handleGirlFriendNotFound (GirlFriendNotFoundException例外){ loggerError(异常); 返回新ResponseBean (ExceptionEnum.GIRL_FRIEND_NOT_FOUND); } 私人空间logError(异常e) { logger.error (e.getMessage ()); } }
<强> 3,全局异常处理强>
个人观点:全局异常应该处理系统故障级别的问题,像参数校验这种类型的异常,应该作为局部异常来处理,例如复述,连接断开,无法请求数据,这种异常就应该当做全局异常来处理,在异常处理的逻辑中,还应该添加通知到开发人员的功能,方便开发人员及时处理错误!