EJB 3.0异常处理

时间:2013-01-18 22:01:41

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

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参考实现开发人员(容器开发人员):在后一种情况下,容器不能将系统异常传播到我的业务方法,而{{1 block永远不会捕获任何系统异常?

2 个答案:

答案 0 :(得分:14)

还有更多类型的例外:

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

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

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

如果您的程序抛出RuntimeException,它将被发送到以RemoteException包装的客户端,并且您的事务将被回滚。与业务异常相比,它们的排除性较低,因此我们通常不会在EJB端捕获它们。

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

答案 1 :(得分:0)

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

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