【问题标题】:Handling database exceptions处理数据库异常
【发布时间】:2017-01-30 17:12:50
【问题描述】:
我正在开发一个 Spring MVC 应用程序。我有一个 DAO、服务和控制器。在 Dao 中,我有一个查询数据库以返回 Sql 行集的方法。我正在检查 sql 行集是否为空,如果是,我将抛出运行时异常。此外,根据应用程序的逻辑,对数据库的查询应至少返回一行。所以,基本上我假设如果我得到一个空的 sql 行集,那么就会有一些问题,可能是数据库损坏或类似的东西。
这是检查未知异常的正确方法吗?还是应该将 sql 行集原样返回给服务?服务使用此 sql 行集时可能会导致空指针异常。
问题是如果我在 dao 中抛出异常,我无法在测试用例中覆盖该部分。意味着我必须将 db 置于不一致状态才能执行此代码并测试异常处理部分。
【问题讨论】:
标签:
java
mysql
sql-server
spring
【解决方案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";
}
}
【解决方案2】:
DAO 层不应关注业务规则。它应该简单地抽象数据操作,这样服务层就不需要关心数据的存储方式和存储位置。
在我看来,DAO 应该只返回一个空结果集。服务将知道如何处理空结果集,因为服务层通常是存储业务逻辑的地方。