1. 程式人生 > >【第46條】努力使失敗保持原子性

【第46條】努力使失敗保持原子性

   所謂失敗的原子性,就是在一個方法失敗之後,使物件保持“它在被呼叫之前的狀態”。因為,尤其是CheckedException發生後,一般是希望程式可以從異常中恢復過來的。

   那麼如何才能保持物件的狀態呢?最簡單的方法就是使用非可變型別的物件(見【第13條】)。因為無論什麼時候,非可變類的狀態都是不可改變的。

    對於可變物件,常見的方法是在對其進行處理之前,先做引數有效性的檢查(見【第23條】),如果引數有問題,馬上就先丟擲一個異常。這時候物件的狀態還未改變。

    另一種方法是,將處理的過程調整一下順序,讓可能丟擲異常的處理寫在前面,而會改變物件狀態的處理寫在後面。

    還有一種不太常用的方法,是編寫一段恢復程式碼,發生失敗時,可以使物件回滾到操作開始之前的狀態。

    最後一種方法是,在物件的一份臨時拷貝上執行操作,當操作正確結束後,再把臨時拷貝中的結果複製給原來的物件。如果一旦失敗,不進行這個複製,也就保持了原物件的狀態。

    總之,作為方法規範的一部分,任何一個異常都不應該改變物件呼叫該方法之前的狀態。

相關推薦

46努力使失敗保持原子

   所謂失敗的原子性,就是在一個方法失敗之後,使物件保持“它在被呼叫之前的狀態”。因為,尤其是CheckedException發生後,一般是希望程式可以從異常中恢復過來的。    那麼如何才能保持物件的狀態呢?最簡單的方法就是使用非可變型別的物件(見【第13條】)。因為無

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

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

努力使失敗保持原子(64)

失敗的原子呼叫應該使得物件保持在被呼叫之前的狀態,所謂:失敗原子性 幾種途徑實現: 設計一個不可變物件,其失敗原子性是顯然的 對於可變引數,執行前檢查引數有效性 避免執行一半報錯,後續無法執行導致狀態不一致 調整計算順序,使得任何可能失敗的部

47不要忽略異常

    作為本章的最後一條,此條目是一條“紀律”,一條你必須遵守的紀律。雖然這是顯而易見的道理,但卻很容易被違反。     任何一個被丟擲的異常都是API設計者有意為之的,其中蘊含了特定的含義,所以千萬不能忽略它們! try{ ...... }catch (Exc

8改寫equals時總是要改寫hashCode

一個很常見的錯誤根源在於沒有改寫hashCode方法。在每一個改寫了equals的方法的類中,你必須也要改寫hashCode方法。如果不這麼做的話,就會違反Object.hashCode的通用約定,從而導致該類無法與所有基於雜湊值(hash)的集合類結合在一起正常執行,這樣的

10謹慎地改寫clone

    原作者在這一條上用了8頁的篇幅,翻譯版也有7頁,足以說明這一條的重要性。我個人對此條的標註是重量級的5顆星!     克隆——是一個很讓人“感興趣”而又“頗有爭議”的話題,無論是在生物界還是在程式碼的世界中。     Java通過實現Cloneable介面來“說明

Java併發基礎加鎖機制解決原子問題

前言 原子性指一個或多個操作在CPU執行的過程不被中斷的特性。前面提到原子性問題產生的源頭是執行緒切換,而執行緒切換依賴於CPU中斷。於是得出,禁用CPU中斷就可以禁止執行緒切換從而解決原子性問題。但是這種情況只適用於單核,多核時不適用。 以在 32 位 CPU 上執行 long 型變數的寫操作為例來說明。

進擊的Python九章:paramiko模塊、線程與進程、各種線程鎖、queue隊列、生產者消費者模型

password locking form maxsize 廁所 sorted [0 hostname nbsp 一、paramiko模塊 他是什麽東西?   paramiko模塊是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的連

20170522-20170527三周

ans 變量 bsp 混入 width 引用 mar 創建 第三周 less框架的應用 創建後綴為.less的文件 [email protected]/* */ [email protected]/* */:100px; 定義時用: .box{ wi

Python開發六篇:Python基礎條件和循環

ora back strong als 重復執行 操作 enume 條件表達式 服務 目錄 一、if語句 1、功能 2、語法 單分支,單重條件判斷 多分支,多重條件判斷 if + else 多分支if + elif + else 語句小結 + 案例 三元表達式 二、whil

Python開發五篇:Python基礎之2

對齊方式 dex 字符串 後退 ring lag nic 有效 func 字符串格式化 Python的字符串格式化有兩種方式: 百分號方式、format方式 百分號的方式相對來說比較老,而format方式則是比較先進的方式,企圖替換古老的方式,目前兩者並存。[PEP-310

Python開發四篇:Python基礎之函數

nco pos *args 更強 三元 sequence hunk ins att 三元運算 三元運算(三目運算),是對簡單的條件語句的縮寫。 # 書寫格式 result = 值1 if 條件 else 值2 # 如果條件成立,那麽將 “值1” 賦值給result

Python之路五篇:面向對象及相關

訪問 遊戲 font raise 內置 無法 sys 接下來 print 面向對象基礎 基礎內容介紹詳見一下兩篇博文: 面向對象初級篇 面向對象進階篇 其他相關 一、isinstance(obj, cls) 檢查是否obj是否是類 cls 的對象 class F

四組典型場景:查看導入的圖片,工作序號:001,2017/7/6

想要 新的 掃描 app 場景 照片 工作 背景 一個地方 場景 工作項序號001:查看導入的圖片,最後修改時間:2017/7/6 1. 背景 1) 典型用戶:羅小歐[主要]、朱小葉[主要] 2) 用戶的需求/迫切需要解決的問題 a. 羅小歐:出去玩拍了好多照片,想要在一個

三次沖刺會議總結四組

transform menu 顯示 c# 大小 urg 文件 tran 手動 第三次沖刺會議 2017 7 13 邱亞威:做了:vs2017環境配置的徹底完成,3D街景標簽插入代碼的編寫 困難:c#之前沒好好學,所以需要邊學邊編程 規劃:標簽插入功能的完成 諸子軒:做了

python學習三篇基本數據類型

ini ati 絕對值 ef6 ict trunc any 替換 不包含 Number(數字) int(整型)   在32位機器上,整數的位數為32位,取值範圍為-2**31~2**31-1,即-2147483648~2147483647  在64位系統上,整數的位數為6

四組十次沖刺會議總結

http 分享 ima 會議 mit 進度 做了 分類 轉換 梁:做了:完善界面ui設計   問題:暫時沒問題   規劃:寫技術報告 邱:做了:鏡頭轉換文檔API的學習   問題:鏡頭轉換太突然   規劃:協助張裕浩完成得到路徑功能 諸:做了:首頁按

四組十一次沖刺會議報告

log nbsp 使用 images -1 有一個 美化 .com 一次 邱:做了:鏡頭轉換分析   問題:鏡頭轉換還是太突然   規劃:努力完善鏡頭轉換武:做了:好幾種大小顏色的LOGO供使用   問題:沒有,我是優秀的美工   規劃:做做其他設計

四組十二次沖刺會議報告

commit 執行 完成 技術文檔 整體 alt 點擊 轉換 導入 張:做了:美化初始化界面,解決文件沖突  困難:嵌入js的時候傳的是string[],但是只執行string[0]  規劃:多個點的連接(動態添加point),點擊標簽跳轉,導入圖片,顯示界面 孔:做了:細

四組十五次沖刺會議報告

技術分享 細節 新的 ui設計 進度 無法 激勵 整合 做出 張:做了:和3D圖片界面銜接,細節優化,3D街景播放暫停,添加音樂   問題:不會控制線程   規劃:街景重復顯示,街景沒有反饋,街景路徑優化,一個點顯示BUG 孔:做了:完善界面 UI設計