主要思想:
子程序應(yīng)該不因傳入錯(cuò)誤數(shù)據(jù)而被破壞匈挖, 哪怕是由其他子程序產(chǎn)生的錯(cuò)誤數(shù)據(jù)碾牌;換一種說法是, 程序員應(yīng)該承認(rèn)程序都是有問題的都需要被修改儡循。
保護(hù)程序免遭非法輸入數(shù)據(jù)破壞
軟件開發(fā)領(lǐng)域“垃圾進(jìn)小染,垃圾出”的原則已經(jīng)過時(shí),應(yīng)該做到: 垃圾進(jìn)贮折,什么都不出裤翩;垃圾進(jìn),出錯(cuò)誤提示调榄;不許垃圾進(jìn)踊赠。做法如下:
- 檢查所有來源于外部的值
- 檢查子程序所有輸入?yún)?shù)的值
- 決定如何處理錯(cuò)誤的輸入數(shù)據(jù)
Assertions 斷言
在程序開發(fā)和使用期間,用于程序自檢的代碼即為斷言每庆; 使用斷言可以在程序出現(xiàn)問題時(shí)讓程序員更快速的根據(jù)斷言給出的信息排查問題和原因筐带。
斷言通常含有兩個(gè)參數(shù):一個(gè)描述假設(shè)為真時(shí)的情況的布爾表達(dá)式,一個(gè)斷言為假時(shí)需要顯示的信息缤灵。建立自己的斷言機(jī)制
使用斷言的指導(dǎo)建議
- 用錯(cuò)誤處理代碼來處理預(yù)期會發(fā)生的情況伦籍, 用斷言來絕不應(yīng)該發(fā)生的狀況
- 避免把需要執(zhí)行的代碼放到斷言中
- 用斷言來注解并驗(yàn)證前后條件
- 對于高健壯性的代碼蓝晒, 應(yīng)該線使用斷言再處理錯(cuò)誤
錯(cuò)誤處理技術(shù)
可以使用的技術(shù):返回中立值;換用下一個(gè)正確數(shù)據(jù)(如讀取數(shù)據(jù))帖鸦;返回與前次相同的數(shù)據(jù)(如圖像顯示處理)芝薇;換用最接近的合法值(超過預(yù)設(shè)范圍的值);把警告信息記錄到日志文件中作儿;返回一個(gè)錯(cuò)誤碼洛二;調(diào)用錯(cuò)誤處理子程序或?qū)ο螅划?dāng)錯(cuò)誤發(fā)生時(shí)顯示出錯(cuò)信息攻锰;用最妥當(dāng)?shù)姆绞皆诰植刻幚礤e(cuò)誤晾嘶;關(guān)閉程序。
健壯性與正確性
二者在某種意義上是相斥的
高層次設(shè)計(jì)對錯(cuò)誤處理方式的影響
異常 Exceptions
把代碼中的錯(cuò)誤和異常事件傳遞給調(diào)用方代碼的一種特殊手段娶吞。
審慎明智的使用異常:
- 用異常通知程序的其他部分垒迂,發(fā)生了不可忽略的錯(cuò)誤
- 只在真正例外的情況下才拋出異常
- 不能用異常來推卸責(zé)任
- 避免在構(gòu)造函數(shù)和析構(gòu)函數(shù)中拋出異常, 除非你在同一個(gè)地方把他們捕獲
- 在恰當(dāng)?shù)某橄髮哟螔伋霎惓#ㄈ鐠伋龈讓赢惓#?/li>
- 在異常消息中加入導(dǎo)致異常發(fā)生的全部信息
- 避免使用空的catch語句
- 了解所有函數(shù)庫可能拋出的異常
- 考慮創(chuàng)建一個(gè)集中地異常報(bào)告機(jī)制
- 把項(xiàng)目中對異常的使用標(biāo)準(zhǔn)化
- 考慮異常的替換方案
隔離程序妒蛇,使之包容由錯(cuò)誤造成的傷害
隔欄机断,一種代碼的容損策略,如常用的: 在輸入數(shù)據(jù)時(shí)將其轉(zhuǎn)化為恰當(dāng)?shù)念愋汀?/p>
輔助調(diào)試的代碼
不要自動(dòng)地把產(chǎn)品版的限制強(qiáng)加于開發(fā)版 之上
盡早引入輔助調(diào)試的代碼 rails中的 pry材部、 debugger等
采用進(jìn)攻式編程
在開發(fā)階段讓異常盡量顯現(xiàn)出來毫缆,而在產(chǎn)品真正運(yùn)行時(shí)能夠自我修復(fù)
計(jì)劃移除調(diào)試輔助的代碼
- 使用版本控制工具
- 使用內(nèi)置的預(yù)處理器
- 編寫你自己的預(yù)處理器
- 使用調(diào)試存根
確定在產(chǎn)品代碼中該保留多少防御式代碼
- 保留那些檢查重要錯(cuò)誤的代碼
- 去掉檢查細(xì)微錯(cuò)誤的代碼
- 去掉可以導(dǎo)致程序硬性崩潰的代碼
- 保留可以讓程序穩(wěn)妥崩潰的代碼
- 為你的技術(shù)支持人員記錄錯(cuò)誤信息
- 確認(rèn)留在代碼中的錯(cuò)誤信息是友好的
對防御式變成采取防御式姿態(tài)
用防御的姿態(tài)適當(dāng)?shù)囊虻刂埔说氖褂梅烙酱a