Checked Exception & Unchecked Exception

查Spring事务管理时看到一句话:

Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的。

那么,什么是Checked Exception & Unchecked Exception ?

Unchecked Exception:
a. 指的是程序的瑕疵或逻辑错误,并且在运行时无法恢复。
b. 包括Error与RuntimeException及其子类,如:OutOfMemoryError, UndeclaredThrowableException, IllegalArgumentException, IllegalMonitorStateException, NullPointerException, IllegalStateException, IndexOutOfBoundsException等。
c. 语法上不需要声明抛出异常。

Checked Exception:
a. 代表程序不能直接控制的无效外界情况(如用户输入,数据库问题,网络异常,文件丢失等)
b. 除了Error和RuntimeException及其子类之外,如:ClassNotFoundException, NamingException, ServletException, SQLException, IOException等。
c. 需要try catch处理或throws声明抛出异常。 

但是,为毛"Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的。"?

另外,@Transactional()

org.springframework.transaction.support.TransactionTemplate

    @Override
    public <T> T execute(TransactionCallback<T> action) throws TransactionException {
        if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
            return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);
        }
        else {
            TransactionStatus status = this.transactionManager.getTransaction(this);
            T result;
            try {
                result = action.doInTransaction(status);
            }
            catch (RuntimeException ex) {
                // Transactional code threw application exception -> rollback
                rollbackOnException(status, ex);
                throw ex;
            }
            catch (Error err) {
                // Transactional code threw error -> rollback
                rollbackOnException(status, err);
                throw err;
            }
            catch (Exception ex) {
                // Transactional code threw unexpected exception -> rollback
                rollbackOnException(status, ex);
                throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception");
            }
            this.transactionManager.commit(status);
            return result;
        }
    }

如何改变默认规则:
  1, 让checked exception也回滚: @Transactional(rollbackFor=Exception.class)

  2, 让unchecked exception不回滚: @Transactional(notRollbackFor=RunTimeException.class)

  3, 不需要事务管理的(只查询的)方法: @Transactional(propagation=Propagation.NOT_SUPPORTED)

时间: 2024-10-11 13:45:51

Checked Exception & Unchecked Exception的相关文章

【Java】Checked、Unchecked Exception

Checked Exception:需要强制catch的异常, Unchecked Exception:这种异常时无法预料的,即RuntimeException,就是运行时的异常. Exception及Error Exception: 1.可以是可被控制的(checked)或不可控制的(unchecked) 2.表示一个由程序员导致的错误 3.应该在应用程序级被处理 Error: 1.总是不可控制的(unchecked) 2.经常用来表示系统错误或低层资源的错误 3.如果可能的话,应该在系统级被

Java中的checked exception和unchecked exception

Java中的checked exception和unchecked exception Java中有两种异常:checked exception和unchecked exception. checked exception checked exception是这样定义: A checked exception is an exception that must be either caught or declared in a method where it can be thrown. 也就是

【转】Java异常:选择Checked Exception还是Unchecked Exception?

Java包含两种异常:checked异常和unchecked异常.C#只有unchecked异常.checked和unchecked异常之间的区别是: Checked异常必须被显式地捕获或者传递,如Basic try-catch-finally Exception Handling一文中所说.而unchecked异常则可以不必捕获或抛出. Checked异常继承java.lang.Exception类.Unchecked异常继承自java.lang.RuntimeException类. 有许多支

java异常—检查异常(checked exception)和未检查异常(unchecked exception)

网易面试要我画异常的结构图,什么是检查异常,什么是非检查异常,我当时的表情是这样的,.我看过,忘了.没办法,继续看,写博客掌握. 先来看看异常的结构图,建议你结合JDK一起看. 可以看出异常的家族势力庞大,通常我们说的异常是包括exceptio和error. Exception家族我们恐怕见的不少,但是error家族我们可能就没什么印象了,下面我来说说这两个类的区别: Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题.大多数的错误与代码编写者执行的操作无关,而是表示代码运行

[转]Unchecked Exception 和 Checked Exception 比较

Throwable类是所有异常的始祖,它有两个直接子类Error / Exception:   Error仅在Java虚拟机中发生动态连接失败或其它的定位失败的时候抛出一个Error对象.一般程序不用捕捉或抛出Error对象. Unchecked Exception: a. 指的是程序的瑕疵或逻辑错误,并且在运行时无法恢复. b. 包括Error与RuntimeException及其子类,如:OutOfMemoryError, UndeclaredThrowableException, Ille

checked exception和unchecked exception区别

http://blog.csdn.net/yuefengyuan/article/details/6204317 一. Java 中定义了两类异常: 1) Checked exception: 这类异常都是Exception的子类 .异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常.可能导致的问题:代码效率低,耦合度过高.C#中就没有使用这种异常机制. 2) Unchecked exception: 这类异常都是RuntimeException的子类,虽

java中的Checked Exception和Unchecked Exception的区别

Java 定义了两种异常: - Checked exception: 继承自 Exception 类是 checked exception.代码需要处理 API 抛出的 checked exception,要么用 catch 语句,要么直接用 throws 语句抛出去. - Unchecked exception: 也称 RuntimeException,它也是继承自 Exception.但所有 RuntimeException 的子类都有个特点,就是代码不需要处理它们的异常也能通过编译,所以它

异常处理—checked exception 和 unchecked exception

异常的Root Class是Throwable,Throwable派生了Error和Exception. Java 8 API Doc中对checked exception和unchecked exception 的说明: 1. checked exception:(在Exception类中的说明) The class Exception and any subclasses that are not also subclasses of RuntimeException are checked

检查型异常(Checked Exception)和非检查型异常(Unchecked Exception)的区别

最近温故spring事务相关知识点,我们知道Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚 (至于为什么spring要这么设计:因为spring认为Checked的异常属于业务的,程序猿需要给出解决方案而不应该直接扔该框架) 这里就引出一个小的知识点,什么是Checked Exception?什么是Unchecked Exception? 其实,Java语言规范对这两个定义十分简单,将派生于Error或者RuntimeExce