try{} catch(Exception e){}異常丟擲與Spring事務回滾策略
阿新 • • 發佈:2019-02-20
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預設的事務處理準確處理。