1. 程式人生 > >try{} catch(Exception e){}異常丟擲與Spring事務回滾策略

try{} catch(Exception e){}異常丟擲與Spring事務回滾策略

Spring的事務管理預設只對出現執行期異常(java.lang.RuntimeException及其子類)進行回滾。

如果一個方法丟擲Exception或者Checked異常,Spring事務管理預設不進行回滾。

Throwable分為Error和Exception(RuntimeException)
Throwable是所有異常的根,java.lang.Throwable
Error是錯誤,java.lang.Error
Exception是異常,java.lang.Exception

  • Exception
    一般分為Checked異常和Runtime異常,所有RuntimeException類及其子類的例項被稱為Runtime異常,不屬於該範疇的異常則被稱為CheckedException。
    Checked異常

    只有java語言提供了Checked異常,Java認為Checked異常都是可以被處理的異常,所以Java程式必須顯示處理Checked異常。如果程式沒有處理Checked異常,該程式在編譯時就會發生錯誤無法編譯。這體現了Java的設計哲學:沒有完善錯誤處理的程式碼根本沒有機會被執行。對Checked異常處理方法有兩種
    (1) 當前方法知道如何處理該異常,則用try…catch塊來處理該異常。
    (2) 當前方法不知道如何處理,則在定義該方法是宣告丟擲該異常。
    我們比較熟悉的Checked異常有
    Java.lang.ClassNotFoundException
    Java.lang.NoSuchMetodException
    java.io.IOException
    RuntimeException

    Runtime如除數是0和陣列下標越界等,其產生頻繁,處理麻煩,若顯示申明或者捕獲將會對程式的可讀性和執行效率影響很大。所以由系統自動檢測並將它們交給預設的異常處理程式。當然如果你有處理要求也可以顯示捕獲它們。
package com.YouXu.view;

import org.junit.Test;

/**
 * 
 * @Title: RuntimeExcetionMethods.java
 * @Package: com.YouXu.view
 * @Copyright: Copyright (c) 2015
 * @author you.xu
 * @date 2016年3月14日下午3:37:51
 * @version
1.0 */
public class RuntimeExcetionMethods { public void method1() throws RuntimeException { System.out.println("我是丟擲執行時異常的方法"); } @Test public void testMethod1_01() { method1(); } @Test public void testMethod1_02() { throw new RuntimeException(); } }

我們比較熟悉的RumtimeException類的子類有
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException

  • Error
    當程式發生不可控的錯誤時,通常做法是通知使用者並中止程式的執行。與異常不同的是Error及其子類的物件不應被丟擲。
    Error是throwable的子類,代表編譯時間和系統錯誤,用於指示合理的應用程式不應該試圖捕獲的嚴重問題。
    Error由Java虛擬機器生成並丟擲,包括動態連結失敗,虛擬機器錯誤等。程式對其不做處理
  • 改變預設方式
    在@Transaction註解中定義noRollbackFor和RollbackFor指定某種異常是否回滾。
    @Transaction(noRollbackFor=RuntimeException.class)
    @Transaction(RollbackFor=Exception.class)
    這樣就改變了預設的事務處理方式。
  • 啟示
    這就要求我們在自定義異常的時候,讓自定義的異常繼承自RuntimeException,這樣丟擲的時候才會被Spring預設的事務處理準確處理。