33

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

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

  • 这是否包括所有异常、运行时和检查(无论来源)?

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

  • 提供者代码抛出的其他异常呢?
  • 其他 Java EE 库抛出的异常呢?
  • 如果异常被包裹在一个 中,它会有什么不同EJBException吗?

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

4

2 回答 2

53

当存在业务逻辑错误而不是系统错误时,应引发应用程序异常。

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

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

这是否包括所有异常、运行时和检查(无论来源)?

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

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

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

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

其他 Java EE 库抛出的异常呢?

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

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

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

如果异常被包装在 EJBException 中,是否会有所不同?

是的。它将影响您如何处理客户端代码中的异常。

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

我希望它有点帮助。

于 2013-10-24T10:55:05.780 回答
10

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

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

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

于 2014-04-28T13:34:08.057 回答