JavaEE EntityManager 异常处理

JavaEE EntityManager exception handling

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

  }
}

感谢您的指教!

大多数 N-tier 应用程序在服务 class 上指定了一些事务边界。在那里捕获这些类型的异常并在此处抛出用例特定异常比将此逻辑处理向下推到 DAO 更合适。

暂时考虑一个 DAO 方法被两个不同的服务 class 实现使用。可以想象,它们解决了您业务领域中的不同问题,因此抛出的异常应该更多 domain-specific。

如果我们采用您的第二种方法,您将捕获这些异常并从 DAO 中抛出一些超级通用异常,只是为了捕获这些异常,re-throw 服务级别的更精细的异常,即矫枉过正。

我的经验法则是在 service/domain 级别捕获这些类型的情况,从那里传播域特定异常并根据需要在控制器中处理这些异常,也许通过一些特定的错误处理程序显示根据异常类型等适当的网页视图