SQL异常处理

1. 问题

发现,username已经添加了唯一约束,不能重复。

2. 解决方案

通过全局异常处理器来处理。

java 复制代码
/**
 * 全局异常处理器,处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {  

    /**
     * 处理SQL异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
        //Duplicate entry 'zhangsan' for key 'employee.idx_username'
        String message = ex.getMessage();
        if(message.contains("Duplicate entry")){
            String[] split = message.split(" ");
            String username = split[2];
            String msg = username + ."已存在";
            return Result.error(msg);
        }else{
            return Result.error("未知错误");
        }
    }

}

这段代码是一个 全局异常处理器,用于捕获项目中可能抛出的 SQL 相关异常,并且对特定的错误信息进行处理和反馈给前端。在大型项目中,异常处理是非常重要的一个环节。处理异常可以提升用户体验,让用户看到更有意义的提示,而不是直接让程序崩溃或者返回不友好的错误信息。

  • @RestControllerAdvice:这是一个全局异常处理注解,能够捕获控制器中抛出的异常并进行处理。
  • @ExceptionHandler :指定了处理 SQLIntegrityConstraintViolationException 异常的方法,这个异常常见于违反数据库唯一性约束时(如插入重复数据)。
  • 异常处理逻辑
    • 通过 ex.getMessage() 获取异常的详细信息。
    • 如果异常信息包含 "Duplicate entry",说明是由于重复数据引起的。
    • 通过字符串分割提取出重复的字段值(如用户名),然后生成用户友好的提示信息(如 zhangsan已存在)。
    • 如果不是重复数据错误,返回通用的提示 "未知错误"

3. 扩展

3.1 为什么要处理异常

  • 提升用户体验:让用户看到更直观的错误提示,而不是复杂的技术信息。
  • 增强安全性:避免暴露数据库内部信息,减少安全风险。
  • 集中管理异常:通过全局异常处理器,能够在一个地方处理项目中所有的异常,避免在每个控制器方法中重复处理。

3.2 处理思路

  • 捕获异常:统一捕获数据库异常,避免程序直接崩溃。
  • 分析信息:从异常信息中提取出具体的重复字段,生成友好的提示。
  • 返回响应 :通过 Result.error() 将处理后的信息返回给前端,提升用户体验。
相关推荐
VX:Fegn08955 小时前
计算机毕业设计|基于ssm + vue超市管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
chipsense5 小时前
电流传感器型号从数据库查询并排序输出到网页的方法
数据库·php·传感器·霍尔电流传感器
踢足球09295 小时前
寒假打卡:2026-01-28
数据库·oracle
麦聪聊数据5 小时前
智慧医疗数据互联互通:使用 QuickAPI 构建实时诊疗数据交换层
数据库·sql·安全
风吹落叶花飘荡6 小时前
2026年mysql数据库迁移(全流程)
数据库·mysql
徐徐同学6 小时前
cpolar为IT-Tools 解锁公网访问,远程开发再也不卡壳
java·开发语言·分布式
2301_822382766 小时前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
m0_748229996 小时前
Laravel8.X核心功能全解析
开发语言·数据库·php
Mr.朱鹏7 小时前
Nginx路由转发案例实战
java·运维·spring boot·nginx·spring·intellij-idea·jetty
液态不合群7 小时前
【面试题】MySQL 的索引下推是什么?
数据库·mysql