Checked 和 Unchecked Exceptions,spring rollback怎么设置?

默认情况下,在遇到运行时异常和Error,Spring事务会进行回滚,而遇到非运行时异常Exception则不会回滚。

可以通过rollbackFor指定需要回滚的受检查异常,指定异常之后,被指定的异常和该异常的子类都会得到回滚,并且运行时异常和Error异常仍然会得到回滚。

那么问题来了,我们需不需要指定非运行时异常也回滚?

先看一下什么是Checked 和 Unchecked Exceptions

1. Checked异常

这类异常会在编译时进行检查。如果方法代码中抛出了此类异常,则该方法必须处理该异常,或通过throws关键字向外抛出。

2. Unchecked异常

这类异常会在编译时不会进行检查。以C++中所有的异常都是unchecked的,所以编译器不会去处理这类异常。需要开发者决定如何处理。

在java中,所有继承自Error和RuntimeException 的异常类都是unchecked异常,其它所有的throwable子类都是checked的。

             +-----------+
           | Throwable |
                   +-----------+
                    /         \
           /           \
          +-------+          +-----------+
          | Error |          | Exception |
          +-------+          +-----------+
       /  |  \           / |        \
     \________/       \______/         \
                                  +------------------+
    unchecked        checked      | RuntimeException |
                                  +------------------+
                                   /   |    |      \
                                  \_________________/
                       
                                      unchecked

3. 如何使用异常

在java中,由于unchecked 异常(RuntimeException, Error和它们的子类)不需要在方法中捕获或声明,许多程序员可能会将所有的异常都继承自RuntimeException,或直接抛出unchecked异常。这么做可以使用程序员不用担心编译错误,也不需要在方法中使用try…catch。虽然这些做法看起来会让开发者比较方便,但它回避了catch和异常声名要求的设计初衷,可能会给你方法的调用者带来麻烦。

方法声明中的异常可以让调用者知道方法会抛出什么异常,然后可以决定如何去处理它们。那些异常的声明和方法的参数与返回声明一样的重要。

那么为什么不一起把uncheck异常也一起声明呢?因为运行时异常都是编程异常,调用者无法处理这些异常。比如arithmetic exceptions,除以0;空指针异常;数组越界。运行时异常可能会发生在程序的任何地方,数量可能会非常多。添加运行时异常到方法声明中会降低方法的可读性。所以,虽然你也可以列出运行时异常,但编译器不会强制要求。

还有一个常用的做法是,如果使用者不正确地调用了方法,会抛出运行时异常。比如,方法里可以检查参数是否为null,如果是null,则抛出空指针异常。

总的来说,不要因为不想在方法声明中添加异常说明 而 简单地把所有异常都继承自RuntimeException 。

设计指导:如果调用者可以处理该异常,则该异常应该是checked 异常。如果调用者无法处理该异常,则是unchecked 异常。

4. spring rollback异常怎么设置?

  1. 如果你使用了try…catch,而该异常需要回滚,请抛出该异常
  2. 如果你的方法声明中有throws,请把其中需要回滚的异常添加到rollbackFor中;否则不需要添加rollbackFor属性。

列出常用的Checked 和Unchecked 异常可以帮我们做决定。

4.1 常用Checked异常列表

java.lang 包里的checked异常:

  • ReflectiveOperationException
    • ClassNotFoundException
    • InstantiationException
    • IllegalAccessException
    • InvocationTargetException
    • NoSuchFieldException
    • NoSuchMethodException
  • CloneNotSupportedException
  • InterruptedException

java.io 包里的checked异常:

  • IOException
    • EOFException
    • FileNotFoundException
    • InterruptedIOException
    • UnsupportedEncodingException
    • UTFDataFormatException
    • ObjectStreamException
  • InvalidClassException
  • InvalidObjectException
  • NotSerializableException
  • StreamCorruptedException
  • WriteAbortedException

java.net 包里的checked异常(大部分是IOException的子类):

  • SocketException
    • BindException
    • ConnectException
      HttpRetryException
  • MalformedURLException
  • ProtocolException
  • UnknownHostException
  • UnknownServiceException

java.sql 包里的checked异常:

  • SQLException

    • BatchUpdateException
    • SQLClientInfoException
    • SQLNonTransientException
  • SQLDataException

  • SQLFeatureNotSupportedException

  • SQLIntegrityConstraintViolationException

  • SQLSyntaxErrorException

    • SQLTransientException
  • SQLTimeoutException

  • SQLTransactionRollbackException

  • SQLTransientConnectionException

    • SQLRecoverableException
    • SQLWarning

4.2 常用Unchecked异常列表

java.lang 包里的unchecked异常:

  • ArithmeticException
  • IndexOutOfBoundsException
    • ArrayIndexOutOfBoundsException
    • StringIndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException
  • EnumConstantNotPresentException
  • IllegalArgumentException
    • IllegalThreadStateException
    • NumberFormatException
  • IllegalMonitorStateException
  • IllegalStateException
  • NegativeArraySizeException
  • NullPointerException
  • SecurityException
  • TypeNotPresentException
  • UnsupportedOperationException

java.util 包里的unchecked异常:

  • ConcurrentModificationException
  • EmptyStackException
  • NoSuchElementException
    • InputMismatchException
    • MissingResourceException
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiegwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值