处理数据库异常

时间:2016-09-22 08:15:39

标签: java mysql sql-server spring

我正在开发一个spring MVC应用程序。我有一个DAO,服务和控制器。在Dao中,我有一个查询数据库以返回Sql行集的方法。我正在检查sql rowset为空,如果是,我正在抛出运行时异常。此外,根据应用程序的逻辑,对数据库的查询应返回至少一行。所以,基本上我假设如果我得到一个空的sql rowset,那么就有一些问题,可能是数据库已损坏或类似的东西。

这是检查未知异常的正确方法吗?或者我应该将sql行集返回给服务吗?当service使用此sql rowset时,它可能导致空指针异常。

问题是如果我在dao中抛出异常,我无法在测试用例中覆盖该部分。意味着我必须将db置于不一致的状态,以便此代码执行并测试异常处理部分。

2 个答案:

答案 0 :(得分:1)

DAO层不应该关注业务规则。它应该简单地抽象数据操作,以便服务层不需要关心存储数据的方式和位置。

在我看来,DAO应该只返回一个空结果集。服务层将知道如何处理空结果集,因为服务层通常是存储业务逻辑的地方。

答案 1 :(得分:1)

不,更一般地说,您不应该仅仅因为您现在没有这种情况或要求而对您的应用程序引入限制。如果您在数据库中没有任何行,那么您的数据库可能只是空的......或者您可能正在对该模式进行测试并且它当前是空的。你这样做就违反了道的关注。

此外,不要担心数据库,这是毫无意义的。如果您无法接受正在运行的工具正常运行,那么您将无法构建任何内容。如果要处理数据库异常,请使用控制器捕获这些异常并重定向到显示错误消息的视图:

@ControllerAdvice
public class ErrorHandler {
    @ExceptionHandler(DataAccessException.class)
    public String handleDatabaseException(DataAccessException ex) {
        return "error";
    }

    @ExceptionHandler(CannotCreateTransactionException.class)
    public String handleAccessException(CannotCreateTransactionException ex) {
        return "database_error";
    }
}