MST

星途 面试题库

面试题:Java异常处理调试之自定义异常与系统交互

假设你开发一个涉及数据库交互的Java应用,自定义了一个 `DatabaseOperationException` 异常。在调试过程中,当这个异常抛出时,如何确保既能准确获取数据库操作失败的具体原因(如SQL语句错误、连接问题等),又能将异常信息以合适的方式反馈给上层调用者以便进行针对性处理?描述调试思路和关键代码实现。
45.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

调试思路

  1. 异常封装:在捕获数据库相关的原始异常(如 SQLException 等)时,将其封装到自定义的 DatabaseOperationException 中,以便保留原始异常的详细信息。
  2. 日志记录:在抛出或捕获 DatabaseOperationException 时,使用日志框架记录异常的详细信息,包括异常堆栈跟踪,便于开发人员排查问题。
  3. 异常传递:将异常按照调用链向上传递,直到合适的层次进行处理,确保上层调用者能够获取到异常信息。

关键代码实现

  1. 自定义异常类
public class DatabaseOperationException extends RuntimeException {
    public DatabaseOperationException(String message, Throwable cause) {
        super(message, cause);
    }
}
  1. 数据库操作方法
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);
        }
    }
}
  1. 上层调用者处理
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());
            }
        }
    }
}