我正在处理我的DAO并且无法弄清楚处理异常的最佳方式是什么。使用.persist()时,可以发出3个异常:EntityExistsException / IllegalArgumentException / TransactionRequiredException。
我只是想知道捕获和抛出异常的最佳方法是什么(我想在更高的层次上处理它)。
我应该抓住并抛出一个简单的异常,还是单独捕获上述异常更有效?
第一种方法,我只是捕获异常并抛出它:
public void addAccount(final Account accountToAdd) throws AccountJpaException {
try {
em.persist(accountToAdd);
} catch (Exception e) {
throw new AccountJpaException(e);
}
}
}
第二种方法:我分别抓住每一个
public void addAccount(final Account accountToAdd) throws AccountJpaException, AccountExistsException {
try {
em.persist(accountToAdd);
} catch (EntityExistsException e) {
throw new AccountExistsException(e);
}catch(IllegalArgumentException e){
throw new AccountJpaException(e);
}catch(TransactionRequiredException e){
throw new AccountJpaException(e);
}
}
}
感谢您的建议!
答案 0 :(得分:0)
大多数N层应用程序在服务类上指定一些事务边界。在那里捕获这些类型的异常并在此抛出特定于用例的异常更合适,而不是将此逻辑处理推送到DAO。
考虑到目前两种不同的服务类实现使用DAO方法。可以想象它们解决了业务领域中的不同问题,因此抛出的异常应该更具域特性。
如果我们采用您的第二种方法,您将捕获这些异常并从DAO中抛出一些超级通用异常,只是为了捕获这些异常并在服务级别重新抛出更细粒度的异常,这是过度的。
我的经验法则是在服务/域级别捕获这些类型的案例,从那里传播特定于域的异常并根据需要在控制器中处理这些异常,可能是由某个特定的错误处理程序显示相应的Web页面视图基于异常类型等