使用@ExceptionHandler对数据库异常进行统一处理

使用@ExceptionHandler对数据库异常进行统一处理
  • 数据库插入异常信息,插入字段长短超时数据库设置字段长度
### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'remark' at row 1
  • 捕获异常处理
    /**
     * 数据库字段长度超出限制异常
     */
    @ExceptionHandler(MysqlDataTruncation.class)
    @ResponseBody
    public KcloudResponse dataTruncationException(MysqlDataTruncation e) {
        log.warn("字段超长");
        // ResponseBuilder统一返回类的一个封装
        return ResponseBuilder.error("字段超长");
    }
  • 结果每次都捕获不到
  • 经调试发现,sql异常被spring做了处理DataIntegrityViolationException
    使用@ExceptionHandler对数据库异常进行统一处理_第1张图片
  • 下面对异常捕获代码进行调整
    /**
     * spring统一捕获sql异常
     */
    @ExceptionHandler(DataIntegrityViolationException.class)
    @ResponseBody
    public KcloudResponse dataIntegrityViolationException(DataIntegrityViolationException e) {
        // 异常信息类
        Throwable cause = e.getCause();
        // 字段超长
        if (cause.getClass().equals(MysqlDataTruncation.class)) {
            log.warn("字段超长");
            return ResponseBuilder.error("字段超长");
            // 数据库插入记录异常,联合索引冲突
        } else if (cause.getClass().equals(SQLIntegrityConstraintViolationException.class)) {
            log.warn("唯一索引冲突");
            return ResponseBuilder.error("唯一索引冲突");
            // 数据库插入异常
        } else if (cause.getClass().equals(SQLSyntaxErrorException.class)) {
            log.warn("数据库插入异常");
            return ResponseBuilder.error("数据库插入异常");
        }

        log.warn("数据库操作异常");
        return ResponseBuilder.error("数据库操作异常");
    }
  • 调整之后就可以正常捕获sql的异常

你可能感兴趣的:(数据库,java)