调试思路
- 异常封装:在捕获数据库相关的原始异常(如
SQLException
等)时,将其封装到自定义的 DatabaseOperationException
中,以便保留原始异常的详细信息。
- 日志记录:在抛出或捕获
DatabaseOperationException
时,使用日志框架记录异常的详细信息,包括异常堆栈跟踪,便于开发人员排查问题。
- 异常传递:将异常按照调用链向上传递,直到合适的层次进行处理,确保上层调用者能够获取到异常信息。
关键代码实现
- 自定义异常类
public class DatabaseOperationException extends RuntimeException {
public DatabaseOperationException(String message, Throwable cause) {
super(message, cause);
}
}
- 数据库操作方法
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DatabaseUtil {
public static void executeUpdate(String sql) {
try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
Statement statement = connection.createStatement()) {
statement.executeUpdate(sql);
} catch (SQLException e) {
throw new DatabaseOperationException("数据库更新操作失败", e);
}
}
}
- 上层调用者处理
public class Main {
public static void main(String[] args) {
try {
DatabaseUtil.executeUpdate("INSERT INTO users (name, age) VALUES ('John', 25)");
} catch (DatabaseOperationException e) {
// 记录日志
e.printStackTrace();
// 向上层反馈异常信息
System.err.println("数据库操作失败: " + e.getMessage());
// 获取原始异常以了解具体原因
Throwable cause = e.getCause();
if (cause instanceof SQLException) {
SQLException sqlException = (SQLException) cause;
System.err.println("SQL错误码: " + sqlException.getErrorCode());
System.err.println("SQL状态: " + sqlException.getSQLState());
}
}
}
}