Clean Code 無瑕的程式碼 第7章 錯誤處理
第七章作者介紹錯誤處理的技巧和要考慮的地方,Try-Catch-Finally必定都會用到。錯誤處理程式不可以干擾主體程式。
使用例外事件而非回傳錯誤碼
古早時代程式發生錯誤會回傳錯誤狀態或是設定錯誤旗標,如7-1。
古早方法會讓程式變得雜亂,影響原本的程式。遇到錯誤的時候,拋出一個例外,會讓程式碼乾淨許多。7-2 是使用例外的方法。
在開頭寫下你的Try-Catch-Finally 敘述
try{
正常程式
}catch(e){
例外處理程式
}
Try區塊放正常程式
Catch區塊放例外處理程式
使用不檢查型例外(Use Unchecked Exceptions)
Java支援檢查型例外(Checked Exceptions)
C#,C++,Python與Ruby都不支援檢查型例外。
檢查型例(Checked Exceptions)外違反開放閉合準則(OCP),對軟體底層的修改,也會影響軟體高層的部分。
提供發生例外的相關資訊
例外發生的時候要提供足夠的資訊
哪個操作發生錯誤
錯誤的型態
發生例外的時間
跳出例外的地點
通常也會寫log檔案記錄例外訊息
從呼叫者的角度定義例外類別
看範例可知作者的意思,作者提到一個非常重要的程式技巧包裹(wrap),可以大幅化簡程式。
包裹(wrap)第三方API的好處
減少對第三方API的依賴,可快速更換第三方API
可模擬第三方API的呼叫,協助測試
化繁為簡變得只定義單一型態的例外
定義正常的程式流程
看範例可知Catch區塊不應該放商業法則程式。
SPECIAL CASE PATTERN(特殊情況模式)建立一個類別處理特殊情況,總是回傳物件,客戶端就不必處理例外行為。
不要回傳null (空值)
作者批評有的程式太多檢查物件是否為null,回傳例外事件或是回傳物件,不要回傳null。
若有第三方API會回傳null,可用包裹(wrap)的方法改成拋出例外或是回傳特殊情況物件。
不要傳遞null
不要將null當參數傳遞到函數,範例可看出函數為了要檢查null,又增加許多程式碼。
總結
Clean Code 必須易讀且耐用,錯誤處理程式與主要邏輯程式要分開,程式才容易維護。
留言
張貼留言