JavaEE EntityManager异常处理

时间:2017-02-17 17:52:04

标签: java hibernate exception entitymanager

我正在处理我的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);
    }

  }
}

感谢您的建议!

1 个答案:

答案 0 :(得分:0)

大多数N层应用程序在服务类上指定一些事务边界。在那里捕获这些类型的异常并在此抛出特定于用例的异常更合适,而不是将此逻辑处理推送到DAO。

考虑到目前两种不同的服务类实现使用DAO方法。可以想象它们解决了业务领域中的不同问题,因此抛出的异常应该更具域特性。

如果我们采用您的第二种方法,您将捕获这些异常并从DAO中抛出一些超级通用异常,只是为了捕获这些异常并在服务级别重新抛出更细粒度的异常,这是过度的。

我的经验法则是在服务/域级别捕获这些类型的案例,从那里传播特定于域的异常并根据需要在控制器中处理这些异常,可能是由某个特定的错误处理程序显示相应的Web页面视图基于异常类型等