系统异常与应用程序异常的明确说明

kos*_*tja 29 java jpa exception java-ee

JPA规范区分系统异常和应用程序异常.我对绘制线的确切位置感到有点困惑.我的猜测:

应用程序异常是代码使用的代码或库显式或隐式抛出的异常.

  • 这包括所有异常,运行时和检查,无论来源如何?

系统异常可能是持久性提供程序抛出的异常.它当然包含所有子类javax.persistence.PersistenceException.

  • 那么提供者代码抛出的其他异常呢?
  • 那些其他Java EE库引发的异常呢?
  • 如果异常包含在一个中,它会有所不同EJBException吗?

如何使用ApplicationException注释来影响行为?我还没有看到它被使用过.

jjm*_*tes 46

当出现业务逻辑错误而不是系统错误时,应抛出应用程序异常.

有一个重要的区别:应用程序异常不会自动导致事务回滚.客户端有机会在抛出应用程序异常后进行恢复.

应用程序异常将发送到客户端,而不会重新打包为EJBException.因此,您可以使用它们来报告验证错误或业务逻辑问题,并且它们将到达客户端.

这包括所有异常,运行时和检查,无论来源如何?

否.默认情况下,应用程序异常是不扩展RuntimeException或RemoteException的异常.您可以更改此设置,如下所述.

如何使用ApplicationException注释来影响行为?

如果希望自动回滚事务,可以使用@ApplicationException(rollback = true).

您还可以在RuntimeException和RemoteException的子类上使用注释,以避免包装为EJBExceptions,并定义它们的自动回滚行为.

那些其他Java EE库引发的异常呢?

它们将遵循相同的规则,但您可以使用XML描述符将第三方类声明为应用程序异常(带或不带自动回滚).

那么提供者代码抛出的其他异常呢?

不确定,我认为您很少会看到来自提供商代码的非系统错误(远程或运行时异常).

如果异常包含在EJBException中,它会有所不同吗?

是.它将影响您在客户端代码中处理异常的方式.

(参考:Enterprise JavaBeans 3.0,Bill Burke,O'Reilly)

我希望它有所帮助.

  • 究竟.在我看来,这是一个很好的默认行为和设计.因为很多时候我们无法控制RuntimeExceptions,我猜99,99%的时间,回滚就是我们想要的. (2认同)

Yoi*_*Yoi 8

我觉得,我必须添加Mahesh Desai给Coderanch的这个非常明确的描述:

作为Exception的子类但不是RuntimeException和RemoteException的子类的任何异常都是应用程序异常.所有应用程序异常都是经过检查的异常,因此,当我们在方法中调用另一个可以抛出应用程序异常的方法时,我们必须在调用方法的throws子句中声明它,或者在调用方法的主体中捕获它,或者两者都是.

除RemoteExceptions外,所有系统异常都是未经检查的异常,用户无法处理.

  • +1一个非常简洁的解释.为了完整起见,我会添加@ApplicationException注释. (2认同)
  • 您是否有指向Coderanch上所说内容的链接? (2认同)