Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EJB3.0异常处理_Java_Jakarta Ee_Exception_Ejb_Ejb 3.0 - Fatal编程技术网

Java EJB3.0异常处理

Java EJB3.0异常处理,java,jakarta-ee,exception,ejb,ejb-3.0,Java,Jakarta Ee,Exception,Ejb,Ejb 3.0,引用EJB规范: 如果bean方法遇到系统异常或错误,它应该 只需将错误从bean方法传播到容器 (即,bean方法不必捕获异常) 但我不明白。这是否意味着我不应该捕获所有类型的异常(即尝试捕获Exceptionclass)并将其作为我的应用程序异常重新提交 更清晰的示例如下: public void beanMethod throws MyApplicationException { try { // do something } catch (Exception e) {

引用EJB规范:

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

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

更清晰的示例如下:

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

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

我不知道这个技巧是从哪里得到的,也不知道上下文是什么,但这似乎意味着bean方法本身不应该做任何异常处理,只需抛出它得到的任何东西。通常,通过添加方法主体可能抛出的异常(取决于环境/随机因素,如
throws
子句中的变量输入)可以最好地实现该行为,其中
MyApplicationException
现在是


通常不需要正确处理由方法(而不是方法调用)中的代码错误直接导致的异常,因为这些异常应该通过测试和调试排除。

有更多类型的异常:

  • 系统异常(运行时异常,例如NullPointerException)
  • 业务异常(您自己的异常、扩展异常,但不是运行时异常,例如NotEnoughMoneyOnYourAccountException)
  • 错误(例如OutOfMemoryError)
通常,您应该捕获业务异常。当然,如果你想在客户端处理它,你可以把它扔到客户端。默认情况下,如果抛出BusinessException,EJB容器不会回滚事务,但您可以通过以下方式注释异常来更改此行为:

@ApplicationException(rollback = true)
public class NotEnoughMoneyOnYourAccountException extends Exception {
如果您的程序抛出RuntimeException,它将被包装为RemoteException发送到客户端,并且您的事务将回滚。与业务异常相比,这些异常较少被排除,因此我们通常不会在EJB端捕获它们


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

也就是说,您建议我在ejb方法中不要使用try-catch块?如果您想将非运行时异常包装到自己的程序中,也许可以。例如SQLException-->MyBusinessException.ok,谢谢。如果我的EJB使用DAO层,并且DAO层可以抛出RuntimeException呢?我是否可以在Ejb业务方法中捕获特定于DAO的异常,并将其作为
MyBusinessException
重新发送?若我并没有捕捉到它,那个么容器将假定我的DaoException是一个系统异常,并因此销毁ejb实例(当系统异常发生时ejb实例被销毁)。但我不想因为SQLCodeYes中的一些错误而丢失ejb实例。例如:}catch(SQLException e){throw new NotEnoughMoneyOnYourAccountException(e.getMessage(),e.getCause());