1. 程式人生 > >第六十四條 努力使失敗保持原子性

第六十四條 努力使失敗保持原子性

當物件丟擲異常後,我們希望這個物件的資料能保持丟擲異常之前的狀態,比如物件裡面有個age的屬性,之前值為20,這時候物件丟擲了異常,我們希望異常後,這個物件的age值仍為20,而不是直接變為0。尤其是受檢的異常,我們總是期望程式能儘量完美的執行下去,從異常中恢復後,保證資料不改變,不丟失。程式物件遇到了異常,但物件的屬性值不應該改變,仍保持呼叫前的狀態和值。具有這種屬性的方法被稱為具有失敗原子性。

有幾種辦法能實現:

一、設計一個不可變的物件,意思就是每進行一步操作,程式都會建立一個新的物件,賦予最新的值。如果程式失敗了,就不會建立新的物件,所以就保留了上一次建立的物件,物件中的值不會改變;我們只是建立新的物件,不停的賦予新的值,成功後才會替換老的物件,所以失敗原子性就是顯然的。

二、老方法,在操作之前檢查引數的有效性,如果不合法,優先丟擲異常或者不執行接下來的邏輯程式碼,這個要根據具體的業務邏輯來判斷。

三、調整計算處理的過程,保證任何可能會失敗的計算部分都在物件狀態被修改之前發生。

四、開啟類似於事務管理器的做法,如果程式沒完全執行成功,就對程式碼的資料進行恢復,恢復到執行邏輯之前的模樣,這個一般是資料庫操作用的比較多。

五、物件進行clone,在一份臨時拷貝的物件上執行操作,操作完成後,使用臨時拷貝的的結果代替物件的內容,這也就是傳說中的備份操作。


我們進行程式碼程式設計,要考慮效能和安全及程式碼邏輯的重要性,然後做出合理的選擇。前三種方法應該比較常見。我們要注意使失敗保持原子性。