java - EJB 3.0 异常处理

标签 java jakarta-ee exception ejb ejb-3.0

引自 EJB 规范:

If the bean method encounters a system exception or error, it should simply propagate the error from the bean method to the container (i.e., the bean method does not have to catch the exception).

但是我不明白。这是否意味着我不应该捕获所有类型的异常(即 try catch 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) block 永远不会捕获任何系统异常?

最佳答案

还有更多类型的异常:

  • 系统异常(RuntimeExceptions 例如 NullPointerException)
  • 业务异常(你自己的异常,extends Exception,但不是 RuntimeException,eg. NotEnoughMoneyOnYourAccountException)
  • 错误(例如 OutOfMemoryError)

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

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

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

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

关于java - EJB 3.0 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14408369/

相关文章:

java - 如何使用 JAXB2.0 禁用 DTD 获取

Java 1.5、Java EE 5、WAS 6.1 : Exception loading a resource bundle with ResourceBundle. getBundle(...)

Python:尝试...除了异常名称的通配符?

c++ - std::exception 是否拥有 `what()` ?

DLL/共享库的异常

java - 如何从请求上下文中获取 url 匹配模板

java - OSX 10.7 (Lion) 上的 Lejos

java - 读取 token 时如何结束streamtokenizer循环?

java - 如何让这个定时器服务类处理 "change in scheduled time"?

java - 父线程在它们退出 servlet 容器之前是否等待子线程退出?