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 必須易讀且耐用,錯誤處理程式與主要邏輯程式要分開,程式才容易維護。