-->

三层架构和异常(Three-tier architecture and exceptions)

2019-07-19 08:32发布

它被认为是很好的做法,对于应用程序的每个层(即异常PresentationExceptionServiceExceptionPersistenceException等)。 但如果我的服务层直接调用DAO方法(持久层的方法),无需额外操作的。

像这样:

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

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

}

我应该换用这个DAO方法调用try-catch块并重新抛出可能的例外为ServiceException ? 如果每个DAO方法只丢PersistenceException

Answer 1:

嗯,你的道异常是无关的业务层和服务层无关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);
      }
   }

}


Answer 2:

是。 其推荐的,正如你提到的,有图层例外; 因为他们可以告诉什么是从服务的角度出发,而不是数据库的问题。



Answer 3:

是的,你应该换在任何情况下的例外,因为你的服务层的客户,否则将被迫也处理数据库层。 这将使事情过于复杂。 请注意,相比将需要处理在服务层之上的层数据库异常的工作时,需要在服务层工作要做的位没有意义很小。



文章来源: Three-tier architecture and exceptions