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

时间:2013-10-24 10:13:43

标签: java java-ee exception jpa

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

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

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

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

  • 提供商代码抛出的其他异常怎么办?
  • 其他Java EE库抛出的异常怎么样?
  • 如果异常包含在EJBException
  • 中会有所不同吗?

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

2 个答案:

答案 0 :(得分:46)

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

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

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

  

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

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

  

如何使用ApplicationException影响行为   注释

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

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

  

其他Java EE库抛出的异常怎么样?

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

  

提供程序代码抛出的其他异常怎么办?

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

  

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

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

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

我希望它有所帮助。

答案 1 :(得分:8)

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

  

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

     

除RemoteExceptions外,所有系统异常都是未经检查的异常   并且它不能由用户处理。