gpt4 book ai didi

java - 在层架构中重现 SQL 异常并正确处理

转载 作者:行者123 更新时间:2023-12-02 00:59:44 25 4
gpt4 key购买 nike

假设我有这个:

String sql = "DELETE FROM "+ TABLE_NAME +"  WHERE id=?";

try {
int ra = jdbcTemplate.update(connection -> {
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setLong(1, id);
stmt.executeUpdate();
return stmt;
});

if (ra == 0)
throw new SQLException(SQL_ERROR);
} catch (SQLException e){
LOGGER.error(SQL_ERROR);
throw new DataAccessLayerException("Entity could not be deleted due to SQL Exception");
}

我正在使用键(id)从表中删除一个实体。现在我希望能够向客户端报告INTERNAL_SERVER_ERROR,而不会导致RuntimeException

但是,我无法重现SQLException。例如,如果我删除 sql 语句中的一个字母,我只会收到一个作为运行时错误抛出的语法错误,而且似乎我没有捕获它。

帮助我理解 SQLException 的确切含义以及如何重现它并将其报告给客户端而不导致 RuntimeException?

最佳答案

你的代码是错误的。您正在调用update(PreparedStatementCreator psc) ,顾名思义,您的代码应该创建一个完全“准备好”的语句对象,但它不应该“执行”该语句,因此删除 executeUpdate()打电话。

update() 调用抛出 DataAccessException,而不是 SQLException,因此是 SQLException 的唯一来源在 try block 内是您的 if 语句,因此您也可以直接抛出 DataAccessLayerException 异常。不过,我建议改为抛出 EmptyResultDataAccessException

由于 Spring 专门将已检查的 SQLException 转换为未检查的 DataAccessException 运行时异常,因此在使用 Spring JDBC 时,您总是会遇到运行时异常,这是一件好事,因为您现在不需要向代码中的所有方法添加受检查的异常。

未处理的异常由 Spring MVC 处理。默认情况下,Spring MVC 将重定向到错误页面。如果您不希望这样,请参阅例如问题Spring Boot Remove Whitelabel Error Page .

关于java - 在层架构中重现 SQL 异常并正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60817211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com