【问题标题】:JavaEE EntityManager exception handlingJavaEE EntityManager 异常处理
【发布时间】:2017-02-17 17:52:03
【问题描述】:

我正在研究我的 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);
    }

  }
}

感谢您的建议!

【问题讨论】:

  • 你真的不应该抓住其中任何一个。尤其不是IllegalArgumentExceptionTransactionRequiredException
  • 这是为什么呢?未处理的异常可能会造成一些混乱,或者我在这一点上完全错了?
  • 因为,正如您的问题所说,您应该在更高级别上处理它们

标签: java hibernate exception entitymanager


【解决方案1】:

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

现在考虑一个 DAO 方法被两个不同的服务类实现使用。可以想象它们解决了您的业务领域中的不同问题,因此要抛出的异常应该更加特定于领域。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 2019-07-21
    • 2015-12-06
    • 1970-01-01
    • 2012-02-03
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多