它被认为是很好的做法,对于应用程序的每个层(即异常PresentationException
, ServiceException
, PersistenceException
等)。 但如果我的服务层直接调用DAO方法(持久层的方法),无需额外操作的。
像这样:
public class MyService {
private IPersonDAO dao = new PersonDAO();
public void deletePerson(int id) {
dao.deletePerson(id);
}
}
我应该换用这个DAO方法调用try-catch
块并重新抛出可能的例外为ServiceException
? 如果每个DAO方法只丢PersistenceException
?
嗯,你的道异常是无关的业务层和服务层无关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);
}
}
}
是。 其推荐的,正如你提到的,有图层例外; 因为他们可以告诉什么是从服务的角度出发,而不是数据库的问题。
是的,你应该换在任何情况下的例外,因为你的服务层的客户,否则将被迫也处理数据库层。 这将使事情过于复杂。 请注意,相比将需要处理在服务层之上的层数据库异常的工作时,需要在服务层工作要做的位没有意义很小。