11

对应用程序的每一层(即 、 等)都有一个例外被认为是一种很好PresentationExceptionServiceException做法PersistenceException。但是如果我的服务层直接调用 DAO 方法(持久层的方法)而不需要额外的操作怎么办。

像这样:

public class MyService {
   private IPersonDAO dao = new PersonDAO();

   public void deletePerson(int id) { 
      dao.deletePerson(id);
   }

}

我应该用一个块包装这个 DAO 方法调用try-catch并将可能的异常重新抛出为ServiceException?每个 DAO 方法都应该只抛出PersistenceException吗?

4

3 回答 3

7

好吧,您的 Dao 异常与服务层无关,而服务层与 dao 层异常无关。正确的方法是捕获 dao 异常并将新的自定义异常重新抛出到服务层。

如果您需要调试异常并且想要确切的原因,可以使用getCause()getSuppressed()方法。

我应该用 try-catch 块包装这个 DAO 方法调用并将可能的异常重新抛出为 ServiceException 吗?每个 DAO 方法是否应该只抛出 PersistenceException?

---> 是的,把它包起来。您可以从 dao 层抛出其他异常。请参见下面的示例:

public class MyDao {       

   public Entity getMyEntity(int id) throws ObjectNotFoundException, PersistenceException {
      try {
         // code to get Entity
         // if entity not found then 
         throw new ObjectNotFoundException("Entity with id : " + id + "Not found.");
      } catch(Exception e) { // you can catch the generic exception like HibernateException for hibernate
         throw new PersistenceException("error message", e);
      }
   }

}
于 2013-02-06T06:32:24.837 回答
2

是的。正如您所提到的,建议对图层进行例外处理;因为他们可以从服务的角度而不是数据库来判断问题所在。

于 2013-02-06T06:08:56.767 回答
0

是的,您应该在任何情况下包装这些异常,否则您的服务层客户端将被迫也处理数据库层。这会使事情变得过于复杂。请注意,与在服务层之上的层中处理数据库异常所需的工作相比,在服务层中需要完成的工作是毫无意义的。

于 2013-02-06T07:43:49.987 回答