13

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)块永远不会捕获任何系统异常?

4

2 回答 2

16

还有更多类型的异常:

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

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

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

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

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

于 2013-01-18T22:20:35.613 回答
0

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

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

于 2013-01-18T22:07:47.247 回答