EJB 3.0 异常处理

2022-09-04 20:42:36

引用 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)


答案 1

还有更多类型的异常:

  • 系统异常(运行时异常,例如。NullPointerException)
  • 业务异常(你自己的异常,扩展异常,但不是运行时异常,例如。NotEnoughMoneyOnYourAccountException)
  • 错误(例如。OutOfMemoryError)

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

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

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

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


答案 2

我不知道你从哪里得到这个提示以及上下文是什么,但这似乎意味着bean方法本身根本不应该做任何异常处理,只是抛出它得到的任何东西。通常,通过添加方法主体可能根据环境/随机因素(例如幽闭中的变量输入)添加异常来实现该行为。throwsMyApplicationException

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