天天看點

【代碼大全】第8章 防禦式程式設計

第八章 防禦式程式設計

防禦式程式設計的主要思想就是,子程式不應該因為傳入錯誤資料而被破壞。其核心想法就是要承認程式都會有問題,都需要被修改。

處理外來垃圾的方法:檢查所有來自外部的資料值,檢查子程式的輸入參數值,決定如何處理資料。

防禦式編碼的最佳方式就是一開始代碼中引入錯誤,使用疊代式設計、編碼前先寫僞代碼、寫代碼前先寫測試用例、底層設計檢查等活動都可以防止。

斷言 在開發階段使用的,讓程式在運作時進行自檢的代碼。可以利用斷言檢查如下假定:

n 輸入參數或輸出參數的取值處于預期範圍

n 子程式開始執行(結束)時,檔案或流處于打開(關閉)狀态

n 子程式開始執行(結束)時,檔案或流的讀寫位置處于開頭(結尾)

n 檔案或流已打開

n 輸入變量的值沒有被子程式修改

n 指針非空

n 傳入子程式的數組至少能容納X個元素

n 表已初始化,存儲着真實的資料

n 子程式開始(結束)時,容器空(滿)

n 一個高度優化過的子程式與一個緩慢的子程式,結果一緻

斷言隻在開發階段被編譯到目标代碼中,而在生成代碼時不編譯進去。使用斷言的指導建議:

n 用錯誤處理代碼來處理預期會發生的狀況,斷言不行!

n 避免把需要執行的代碼放入斷言中(如果未編譯斷言呢?)

n 用斷言來注解并驗證前條件和後條件

n 對于高健壯性的代碼,應該先用斷言,再處理錯誤

錯誤處理技術:傳回中立值,換用下一個正确的資料,傳回與前次相同的資料,換用最接近的合法值,把警告資訊記錄到日志檔案,傳回一個錯誤碼,調用錯誤處理子程式,顯示出錯消息,用最妥當的方式在局部處理錯誤,關閉程式

而處理錯誤最恰當的方式要根據出現錯誤的軟體的類别而定。

異常 用異常通知程式的其它部分,發生了不可忽略的錯誤

n 隻在真正例外的情況下才抛出異常

n 不能用異常來推卸責任

n 避免在構造函數和析構函數中抛出異常,除非你同時捕獲。

n 在恰當的抽象層次抛出異常

n 在異常消息中加入導緻異常的全部資訊

n 避免空的catch

n 了解函數庫可能抛出的異常

n 考慮建立一個集中的異常報告機制

n 把項目中對異常的使用标準化

n 考慮異常的替換方案

隔離程式,使之包容由錯誤産生的損害,它類似于一個消毒室。

輔助調試

n 盡早引入輔助調試的代碼

n 采取進攻式程式設計(確定斷言語句使程式終止,完全填充所有記憶體,完全填充所有檔案或流,删除一個對向前把它填滿垃圾資料)

n 計劃移除調試輔助的代碼(使用版本控制工具,使用内置的預處理器,編寫自己的預處理器,使用調試存根)

産品代碼中該保留多少防禦式代碼?

n 保留檢查重要錯誤的

n 去掉檢查細微錯誤的

n 去掉可能導緻軟體硬性崩潰的

n 保留可以讓軟體穩妥崩潰的

n 為你的技術支援人員記錄錯誤資訊的

n 确認留在代碼中的錯誤資訊都很友好

對于防禦式程式設計,采取防禦的姿态,避免過度。

繼續閱讀