【问题标题】:EJB 3.0 exceptions handlingEJB 3.0 异常处理
【发布时间】:2013-01-02 17:18:10
【问题描述】:

引用 EJB 规范:

如果 bean 方法遇到系统异常或错误,它应该 只需将错误从 bean 方法传播到容器 (即 bean 方法不必捕获异常)。

但我不明白。这是否意味着我不应该捕获所有类型的异常(即尝试捕获Exception 类)并将其作为我的应用程序异常重新抛出?

一个更清楚的例子:

public void beanMethod throws MyApplicationException {
  try {
    // do something
  } catch (Exception e) {
     throw new MyApplicationException(e); // Should I do it like this? 
  }
}

或者这不是针对 EJB 开发人员,而是仅针对 EJB 引用实现开发人员(容器开发人员):在后一种情况下,因此,容器不得将系统异常传播到我的业务方法,以及我的 catch(Exception e)块永远不会捕获任何系统异常?

【问题讨论】:

    标签: java jakarta-ee exception ejb ejb-3.0


    【解决方案1】:

    还有更多类型的异常:

    • 系统异常(RuntimeExceptions 例如 NullPointerException)
    • 业务异常(您自己的异常,扩展 Exception,但不是 RuntimeException,例如 NotEnoughMoneyOnYourAccountException)
    • 错误(例如 OutOfMemoryError)

    通常您应该捕获业务异常。但当然,如果你想在那里处理它,你可以把它扔到客户端。默认情况下,如果您抛出 BusinessException,EJB 容器不会回滚您的事务,但您可以通过以下方式注释您的异常来更改此行为:

    @ApplicationException(rollback = true)
    public class NotEnoughMoneyOnYourAccountException extends Exception {
    

    如果您的程序抛出 RuntimeException,它将被包装为 RemoteException 发送到客户端,并且您的事务将被回滚。这些异常比业务异常少,因此我们通常不会在 EJB 端捕获它们。

    错误是最小的例外,它们甚至可以关闭JVM,通常我们不会捕获它们,因为通常我们无法在程序中处理它们。

    【讨论】:

    • 即你建议我在 ejb 方法中根本没有 try-catch 块?
    • 如果你想将非 RuntimeException 包装到你自己的。例如 SQLException --> MyBusinessException。
    • 好的,谢谢。如果我的 EJB 使用 DAO 层,而 DAO 层会抛出 RuntimeException 怎么办?我可以在 Ejb 业务方法中捕获我的 DAO 特定异常并将其重新抛出为MyBusinessException 吗?如果我没有捕捉到它,那么容器将假定我的 DaoException 是系统异常,因此它会破坏 ejb 实例(系统异常发生时 ejb 实例被破坏)。但我不想因为 SQL 代码中的一些错误而丢失 ejb 实例
    • 是的。例如: } catch (SQLException e) { throw new NotEnoughMoneyOnYourAccountException(e.getMessage(), e.getCause());
    【解决方案2】:

    我不知道你从哪里得到这个提示以及上下文是什么,但这似乎意味着 bean 方法本身根本不应该进行异常处理,只要抛出它得到的任何东西。这种行为通常最好通过添加你的方法体可能抛出的异常来实现,具体取决于环境/随机因素,例如 throws 子句中的变量输入,MyApplicationException 现在是。

    直接由方法中的代码错误(不是方法调用)引起的异常通常不需要正确处理,应该通过测试和调试来解决。

    【讨论】:

      猜你喜欢
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多