在spring中分别识别数据库错误和查询错误

时间:2013-12-24 06:13:20

标签: spring spring-mvc spring-jdbc

我正在使用spring 3编写一个RESTful Web服务,我注意到当我实现我的DAO时(我使用spring-jdbc进行数据库访问),抛出的异常非常通用,所以我无法识别如果由于我的数据库关闭或查询失败而发生异常。

示例代码:

try {
    Q q = jdbcTemplate.queryForObject(MY_QUERY, new Object[]{id}, new MyMapper());
    return q;
} catch (DataAccessException e) {
    // What is this exception ? database down ? query failed ?
}

除非我在运行时知道这是什么异常,否则我无法向服务客户端发回合理的错误消息。

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:1)

你不应该试图抓住每一个可能的例外;代码,以便您不会遇到多个用户或程序员错误类型异常的可能性。通常,无论您执行什么操作,每个DAO中都会发生三种类型的异常。 (1)您的数据库已关闭...如果这是您遇到更大问题的问题。 (2)用户身份验证错误很容易捕获和处理(但是你可能应该在RESTful前端处理这种情况。(3)数据不正确。如果你有错误的数据,只需发回尝试的数据,异常的原因。

try {
    Q q = jdbcTemplate.queryForObject(MY_QUERY, new Object[]{id}, new MyMapper());
    return q;
} catch (DataAccessException e) {
    throw new DaoException("Could not retrieve q with ID: " + qID, e);
}

答案 1 :(得分:1)

方法queryForObject仅引发DataAccessExceptionIncorrectResultSizeDataAccessException。由于此级别的数据库连接失败,您不应该捕获异常。但是,在DAO类中,通常有代码来建立可以由Spring的IoC容器注入的dataSource。如果数据库连接失败,那部分代码将抛出异常。你应该在那里捕获数据库失败异常。