系统exception与应用程序exception的明确说明
JPA规范区分系统exception和应用程序exception。 我对绘制线的确切位置感到有点困惑。 我估计:
应用程序exception是代码使用的代码或库显式或隐式抛出的exception。
- 这包括所有exception,运行时和检查,无论来源如何?
系统exception可能是持久性提供程序抛出的exception。 它当然包含javax.persistence.PersistenceException
所有子类。
- 那么提供者代码抛出的其他exception呢?
- 其他Java EE库抛出的exception怎么样?
- 如果exception包含在
EJBException
它会有所不同吗?
如何通过使用ApplicationException批注来影响行为? 我还没有看到它被使用过。
当出现业务逻辑错误而不是系统错误时,应抛出应用程序exception。
有一个重要的区别: 应用程序exception不会自动导致事务回滚 。 客户端有机会在抛出应用程序exception后进行恢复。
应用程序exception将发送到客户端,而不会重新打包为EJBException。 因此,您可以使用它们来报告validation错误或业务逻辑问题,并且它们将到达客户端。
这包括所有exception,运行时和检查,无论来源如何?
否。默认情况下,应用程序exception是不扩展RuntimeException或RemoteException的exception。 您可以更改此设置,如下所述。
如何通过使用ApplicationException批注来影响行为?
如果希望自动回滚事务,可以使用@ApplicationException(rollback = true)。
您还可以在RuntimeException和RemoteException的子类上使用注释,以避免包装为EJBExceptions,并定义它们的自动回滚行为。
其他Java EE库抛出的exception怎么样?
它们将遵循相同的规则,但您可以使用XML描述符将第三方类声明为应用程序exception(有或没有自动回滚)。
那么提供者代码抛出的其他exception呢?
不确定,我认为您很少会看到来自提供商代码的非系统错误(远程或运行时exception)。
如果exception包含在EJBException中,它会有所不同吗?
是。 它将影响您在客户端代码中处理exception的方式。
(参考:Enterprise JavaBeans 3.0,Bill Burke,O’Reilly)
我希望它有所帮助。
我觉得,我必须添加Mahesh Desai给Coderanch的非常明确的描述:
任何exception是Exception的子类,但不是RuntimeException和RemoteException的子类,是一个应用程序exception。 所有应用程序exception都是经过检查的exception,因此,当我们在方法中调用另一个可以抛出应用程序exception的方法时,我们必须在调用方法的throws子句中声明它,或者在调用方法的主体中捕获它,或者两者都是。
除RemoteExceptions外,所有系统exception都是未经检查的exception,用户无法处理。
- 如何在Java中抛出除以零的exception而不实际除以零?
- ibatis spring java.lang.NoSuchMethodError com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse
- 如何使用logger打印exception?
- Java中的exception和inheritance
- org.hibernate.LazyInitializationException:无法初始化代理 – 没有会话
- 使用’if’语句检查后出现空指针exception
- 通过Eclipse运行时,Java无法找到文件
- 索引越界exceptionjava
- “java.lang.IllegalArgumentException:uri.getScheme()== null! “使用JavaFX播放音频时出错