当存在业务逻辑错误而不是系统错误时,应引发应用程序异常。
有一个重要区别:应用程序异常不会自动导致事务回滚。抛出应用程序异常后,客户端有机会恢复。
应用程序异常被发送到客户端而不被重新打包为 EJBException。因此,您可以使用它们来报告验证错误或业务逻辑问题,它们将到达客户端。
这是否包括所有异常、运行时和检查(无论来源)?
否。默认情况下,应用程序异常是不扩展 RuntimeException 或 RemoteException 的异常。您可以更改此设置,如下所述。
如何使用 ApplicationException 注释影响行为?
如果您希望事务自动回滚,可以使用 @ApplicationException(rollback=true)。
您还可以在 RuntimeException 和 RemoteException 的子类上使用注解,以避免包装为 EJBException,并定义它们的自动回滚行为。
其他 Java EE 库抛出的异常呢?
它们将遵循相同的规则,但您可以使用 XML 描述符将第三方类声明为应用程序异常(带或不带自动回滚)。
提供者代码抛出的其他异常呢?
不确定,我认为您很少会看到来自提供程序代码的非系统错误(远程或运行时异常)。
如果异常被包装在 EJBException 中,是否会有所不同?
是的。它将影响您如何处理客户端代码中的异常。
(参考:Enterprise JavaBeans 3.0,Bill Burke,O'Reilly)
我希望它有点帮助。