新增功能的异常捕获

新增功能的异常捕获

问题

在实现新增功能后,遇到了一个问题。当用户尝试添加新员工时,如果输入的账号已经存在,由于在employee表中对该字段添加了唯一约束,程序会抛出异常。java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'zhangsan' for key 'idx_username' 异常。

解决

程序需要进行异常捕获,通常有两种处理方式:

  • 在Controller方法中加入try-catch进行异常捕获

    try{
        employeeService.save(employee);
    }catch(Exception ex){
        R.error("员工已存在");
    }
    
    return R.success("新增员工成功") 
    
  • 使用异常处理器进行全局异常捕获

    • 使用全局异常处理器的好处,在于:

      未捕获异常的处理: 全局异常处理器能够捕获整个程序执行过程中未被显式捕获的异常,防止程序因未捕获异常而终止。这有助于保持程序的稳定性和可靠性。

      异常信息记录和报告: 通过全局异常处理器,你可以在捕获异常时记录相关信息,例如异常类型、发生异常的位置等,从而更容易追踪和调试问题。这对于诊断和解决潜在的问题非常有帮助。

      统一的异常处理逻辑: 全局异常处理器允许你在一个地方集中处理所有的未捕获异常,从而实现统一的异常处理逻辑。这可以包括日志记录、错误报告、用户通知等,有助于代码的维护和管理。

    • ​ 下面是异常处理器进行全局异常捕获的示例。

      @ResponseBody
      @Slf4j
      @ControllerAdvice(annotations = {RestController.class, Controller.class})       //拦截RestController和Controller
      public class GlobalExceptionHandler {
              /**
               * 异常处理方法
               * @param ex
               * @return
               */
              @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
            public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
                log.error(ex.getMessage());
      
                if(ex.getMessage().contains("Duplicate entry")){
                    String[] split = ex.getMessage().split(" ");
                    String msg = split[2] + "已存在";
                    return R.error(msg);
                }
                return R.error("未知错误");
            }
      }
      

      这段代码是一个基于Spring框架的全局异常处理器,该异常通常在数据库操作中违反唯一性约束时抛出。以下是这段代码实现的主要功能过程:

      • 记录异常信息: 通过 log.error(ex.getMessage()) 将异常信息记录到日志中,以便进行调试和监控。
      • 判断异常原因: 使用 ex.getMessage().contains("Duplicate entry") 来判断异常消息中是否包含 “Duplicate entry”,这是通常表示唯一性约束违反的关键字。
      • 构造错误信息: 如果异常是由于唯一性约束违反导致的,就从异常消息中提取出重复的值,并构造一个错误信息,表示该值已存在。
      • 返回响应: 使用自定义的 R 类型进行包装错误信息,并通过 R.error(msg) 返回给客户端。如果异常原因无法确定,返回一个通用的错误信息 “未知错误”。
      • 另外,@ResponseBody 注解: 该注解指示 Spring MVC 框架将方法的返回值直接作为 HTTP 响应体写入到响应中。@ControllerAdvice 注解: 该注解标记了一个类作为全局控制器的通知类。通过 annotations 属性指定了要拦截的控制器注解,这里包括 RestController.classController.class,表示拦截所有标记有这两个注解的控制器。@ExceptionHandler(SQLIntegrityConstraintViolationException.class) 注解: 该注解标记了一个方法,用于处理 SQLIntegrityConstraintViolationException 异常。当控制器中抛出该异常时,Spring会调用这个方法进行处理。
    • 需要注意的是,全局异常处理器并不应该成为处理所有异常的首选方式。在实际的开发中,最好是在代码中明确处理已知的异常,而将全局异常处理作为一个备用的机制,用于捕获和处理未被显式捕获的异常。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值