Java 自定义异常中 SQL 异常怎么包装

老婷小哥_3208

老婷小哥_3208

2026-11-11

470人浏览

原创

在 java 中包装 sqlexception 的核心做法是捕获原始异常,将其作为参数传入自定义异常的构造函数,从而保留完整的堆栈信息。这样做既能让调用者通过 getcause() 获取底层 sql 错误细节,又能让上层业务逻辑统一处理自定义的异常类型。具体实现时,通常定义一个继承自 runtimeexception 或 exception 的业务异常类,并在 dao 层的方法中执行数据库操作。

Java 自定义异常中 SQL 异常怎么包装

如何定义支持链式调用的自定义异常类

直接回答:需要创建一个继承自 Exception 的类,并确保其构造函数正确调用父类构造函数以传递消息和原因对象。这样定义的异常类才能在使用 throw new MyException("msg", e) 时建立异常链。

Java 自定义异常中 SQL 异常怎么包装

package com.example.exception;

import java.sql.SQLException;

public class DataAccessException extends Exception {
    
    public DataAccessException(String message) {
        super(message);
    }

    public DataAccessException(String message, Throwable cause) {
        super(message, cause);
    }
}

上述代码展示了 DataAccessException 的定义。它提供了两个构造函数:一个仅接受消息,另一个同时接受消息和 Throwable 类型的 cause。当我们在 DAO 层捕获 SQLException 并抛出此异常时,应使用第二个构造函数,将原始的 SQLException 实例作为 cause 传入。这确保了异常链的完整性,使得后续可以通过 getCause() 方法获取原始的 SQL 错误信息,如错误码、SQL 状态等。

DAO 层如何捕获并转换 SQLException

直接回答:在 DAO 实现类的方法中,使用 try-catch 块包裹 JDBC 操作代码,catch 住 SQLException 后,抛出自定义异常实例,并将原异常作为原因传入。这样可以将受检异常转换为非受检异常(如果自定义异常继承自 RuntimeException)或统一的业务异常。

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载

Java 自定义异常中 SQL 异常怎么包装

package com.example.dao;

import com.example.exception.DataAccessException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UserDao {

    public void saveUser(Connection conn, String name) throws DataAccessException {
        String sql = "INSERT INTO users (name) VALUES (?)";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, name);
            pstmt.executeUpdate();
        } catch (SQLException e) {
            throw new DataAccessException("Failed to save user: " + name, e);
        }
    }
}

在 UserDao 的 saveUser 方法中,我们首先定义了 SQL 语句并使用 try-with-resources 确保资源释放。接着,在 catch 块中捕获可能发生的 SQLException。这里的关键是将捕获到的 e 作为第二个参数传递给 DataAccessException 的构造函数。这样,当上层业务代码捕获 DataAccessException 时,可以通过 exception.getCause() 获得原始的 SQLException,从而进行更细致的错误处理或日志记录。这种模式避免了在业务层直接依赖 JDBC 特定的异常类型,提高了代码的可测试性和解耦程度。

如何处理包装后的异常中的 SQL 错误码

直接回答:在业务层或全局异常处理器中,通过 getCause() 获取原始的 SQLException 实例,然后调用其 getErrorCode() 或 getSQLState() 方法来提取具体的数据库错误信息。这使得我们可以根据具体的 SQL 错误码(如主键冲突、外键约束失败等)返回不同的 HTTP 状态码或用户提示。

package com.example.handler;

import com.example.exception.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLException;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(DataAccessException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleDataAccessError(DataAccessException ex) {
        Throwable cause = ex.getCause();
        if (cause instanceof SQLException) {
            SQLException sqlEx = (SQLException) cause;
            int errorCode = sqlEx.getErrorCode();
            // 可以根据 errorCode 做更细粒度的处理
            return "Database error code: " + errorCode;
        }
        return ex.getMessage();
    }
}

这段代码展示了一个基于 Spring Boot 的全局异常处理器。它拦截所有 DataAccessException 异常,并尝试从其中提取原始的 SQLException。通过检查 cause 是否为 SQLException 实例,我们可以安全地向下转型并访问其特有的方法,如 getErrorCode()。这种方法允许开发者根据具体的数据库错误行为(例如 MySQL 的错误码 1062 表示重复键值)来定制响应内容,而不是简单地返回通用的“服务器内部错误”。这不仅提升了用户体验,也便于运维人员通过错误码快速定位问题根源。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

12377

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

9462

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

8072

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1304

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1048

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1556

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3249

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20491

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1415

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习