全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈Spring Boot 异常处理篇

前言

先谈谈“异常处理”这件事。下面有 2 份伪代码,对比下:

// ① 基于 if/else 判断
if(deletePage(page) == E_OK){
 if(registry.deleteReference(page.name) == E_OK){
  if(configKeys.deleteKey(page.name.makeKey()) == E_OK){
   logger.log("page deleted");
  }else{
   logger.log("configKey not deleted");
  }
 }else{
  logger.log("deleteReference from registry failed");
 }
}else{
 logger.log("delete failed");
 return E_RROR;
}
// ② 基于异常处理
try{
 deletePage(page);
 registry.deleteReference(page.name);
 configKeys.deleteKey(page.name.makeKey());
}catch(Exception e){
 logError(e);
}

可以看出,如果使用异常替代返回错误码,错误处理代码就能从主路径逻辑中分离出来,得到简化!

②中,基于异常处理的代码真的好吗?其实是丑陋不堪的,它搞乱了代码结构,把错误处理与正常流程混为一谈。最好把 try 和 catch 代码块的主体部分抽离出来,形成另外的函数。

// ③ 优雅的异常处理逻辑
public void delete(Page page){
 try{
  deletePageAndAllReferences(page);
 }catch(Exception e){
  logError(e);
 }
}

private void deletePageAndAllReferences(Page page) throw Exception{
 deletePage(page);
 registry.deleteReference(page.name);
 configKeys.deleteKey(page.name.makeKey());
}

private void logError(Exception e){
 logger.log(e.getMessage());
}

③中,函数各司其职,更易于理解和修改了。

总结:使用异常而不是错误码,优雅地使用异常!函数应该只做一件事,处理错误就是一件事。因此,处理错误的函数不该做其他事!

在 Spring Boot 中处理异常

1、默认的异常处理

例如 401,404,500,5XX 等异常,Spring Boot 默认会跳转到预配置的页面,此处以 thymeleaf 模板引擎为例:

+ resources
 + templates
  + error
   - 401.html
   - 404.html
   - 500.html

只需在 resources/templates/error/ 路径下添加对应的html文件即可。

2、局部异常处理

局部异常一般处理业务逻辑出现的异常情况,在 Controller 下使用 @ExceptionHandler 注解来处理异常。举个小例子:

先定义 ResponseBean 和 ExceptionEnum 两个对象,辅助完成优雅的代码。

/**
 * 统一响应
 * @author anoy
 */
public class ResponseBean<T> {

  private int code;

  private String message;

  private T data;

  public ResponseBean(){}

  public ResponseBean(ExceptionEnum exceptionEnum){
    this.code = exceptionEnum.getCode();
    this.message = exceptionEnum.getMessage();
  }

  // 省略 setter/getter
}

/**
 * 异常类型枚举
 * @author anoy
 */
public enum ExceptionEnum {

  GIRL_FRIEND_NOT_FOUND(100000, "girl friend not found");

  private int code;

  private String message;

  ExceptionEnum(int code, String message){
    this.code = code;
    this.message = message;
  }

  public int getCode() {
    return code;
  }

  public String getMessage() {
    return message;
  }
}

今天七夕,写个 GirlFriendNotFoundException(很有同感,是不是?)

@Controller
public class UserController {

  @RequestMapping("/friend/{id}")
  public String friend(@PathVariable("id") Long id) throws GirlFriendNotFoundException {
    if (id == 1L){
      throw new GirlFriendNotFoundException();
    }
    return "friend";
  }

  @ExceptionHandler(GirlFriendNotFoundException.class)
  @ResponseBody
  public ResponseBean handleGirlFriendNotFound(GirlFriendNotFoundException exception){
    loggerError(exception);
    return new ResponseBean(ExceptionEnum.GIRL_FRIEND_NOT_FOUND);
  }
  
  private void logError(Exception e){
    logger.error(e.getMessage());
  }
}

3、全局异常处理

个人观点:全局异常应该处理系统故障级别的问题,像参数校验这种类型的异常,应该作为局部异常来处理,例如 Redis 连接断开,无法请求数据,这种异常就应该当做全局异常来处理,在异常处理的逻辑中,还应该添加通知到开发人员的功能,方便开发人员及时处理错误!

全局异常处理,使用 @ControllerAdvice @ExceptionHandler 来配合。

@ControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(RedisConnectionFailureException.class)
  public void handlerRedisConnectionFailureException(RedisConnectionFailureException exception){
    logError(exception);
    noticeToDev();
  }

  private void logError(Exception e){
    logger.error(e.getMessage());
  }

  private void noticeToDev(){
    // 通知具体开发人员
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Spring  # Boot  # 异常处理  # Spring Boot统一异常处理详解  # SpringBoot初始教程之统一异常处理详解  # 详解Springboot自定义异常处理  # Spring Boot全局异常处理解析  # springboot全局异常处理详解  # SpringBoot如何优雅的处理全局异常  # Spring boot项目中异常拦截设计和处理详解  # Spring Boot详细打印启动时异常堆栈信息详析  # 开发人员  # 一件事  # 就能  # 各司其职  # 很有  # 只需  # 错误码  # 这件事  # 个人观点  # 为例  # 可以看出  # 只做  # 该做  # 大家多多  # 举个  # 跳转到  # 而不是  # java  # deletePage  # class 


相关文章: 成都网站制作报价公司,成都工业用气开户费用?  已有域名和空间如何快速搭建网站?  宝塔新建站点为何无法访问?如何排查?  淘宝制作网站有哪些,淘宝网官网主页?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  网站制作服务平台,有什么网站可以发布本地服务信息?  定制建站策划方案_专业建站与网站建设方案一站式指南  济南企业网站制作公司,济南社保单位网上缴费步骤?  如何选择适配移动端的WAP自助建站平台?  如何用VPS主机快速搭建个人网站?  建站主机无法访问?如何排查域名与服务器问题  网站制作员失业,怎样查看自己网站的注册者?  制作公司内部网站有哪些,内网如何建网站?  利用JavaScript实现拖拽改变元素大小  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  一键网站制作软件,义乌购一件代发流程?  重庆市网站制作公司,重庆招聘网站哪个好?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  建站与域名管理如何高效结合?  网站制作难吗安全吗,做一个网站需要多久时间?  如何快速生成凡客建站的专业级图册?  PHP 500报错的快速解决方法  常州自助建站费用包含哪些项目?  浅谈Javascript中的Label语句  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何配置IIS站点权限与局域网访问?  定制建站哪家更专业可靠?推荐榜单揭晓  如何在云指建站中生成FTP站点?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何基于云服务器快速搭建网站及云盘系统?  金*站制作公司有哪些,金华教育集团官网?  贸易公司网站制作流程,出口贸易网站设计怎么做?  nginx修改上传文件大小限制的方法  建站之星后台管理:高效配置与模板优化提升用户体验  建站中国官网:模板定制+SEO优化+建站流程一站式指南  c# 在ASP.NET Core中管理和取消后台任务  Swift中循环语句中的转移语句 break 和 continue  建站之星如何优化SEO以实现高效排名?  建站之星安装模板失败:服务器环境不兼容?  临沂网站制作公司有哪些,临沂第四中学官网?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  建站之星24小时客服电话如何获取?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  C++如何使用std::optional?(处理可选值)  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  建站之星如何快速解决建站难题?  建站之星如何通过成品分离优化网站效率? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。