本质:
RuntimeException:是不受检查异常,也就是即便不抛也不会出编译错误,虚拟机会自己抛出来,常见的:NullPointerException,ArrayIndexOutOfBoundsException,IllegalArgumentException,在实际编码过程中,你没有抛它也会自己出。
非RuntimeException:受检查异常,就必须要往上抛,否则编译出错。
设计(自定义异常应该继承谁?):
假如说,让你做一个异常的设计,你会怎么设计?
个人理解:
如果是业务上的异常,并且你知道要如何处理这个异常,那么应该extends Exception。
如果是系统异常或者调API的异常,而且这些异常你无法预料也无法去解决,那么就应该extends RuntimeException
换而言之:
继承RuntimeException可以不对异常主动处理,但发生异常时会导致程序终止。
继承Exception必须对异常主动处理,既然已经处理了,就不会导致程序终止。
Spring事务处理机制之RuntimeException()和Exception()区别:
Spring的@Transactional这个注解默认的是Error和Runtimexception才会回滚事务
如果是Exception的话,Spring是不会回滚事务的。
假如说抛Exception想回滚事务应该怎么做?
①:在service层不使用try......catch或者在catch中最后加上throw new RuntimeException(),这样程序异常时aop才可以捕获异常并进行回滚。
最终在service上层(如controller层、action层、view层)要继续捕获这个异常并处理。
②:在service层方法上进行配置,改变默认规则,方法如下 :
(1) 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
(2)让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
(3)不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
在整个方法运行前就不会开启事务还可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读事务,可以提高效率。