Skip to main content

例外處理設計筆記(1) - Failure, Error, Fault 與 Exception

本系列為閱讀 搞笑談軟工Teddy 的 「例外處理設計的逆襲」的筆記整理,加上一點我自己的理解。感謝 Teddy 免費公開原書手稿,閱讀學習後獲益良多。


對問題有共通的理解基礎,才有辦法做更為深入、有效的討論。

Failure 失效

Failure 是一種現象、結果,一個軟體元件無法提供規格所描述的服務。元件可能是指function, method, service。

  • 函數沒有回傳正確的值,代表服務失效。e.g. add(1,2) != 3 代表服務失效
  • 驗證碼必須在60秒內寄出,超過60秒才寄出或是沒有寄出,代表服務失效
  • 用戶因為連線問題無法開啟首頁,代表服務失效

Error 錯誤

錯誤代表軟體元件內部處於錯誤狀態。這個狀態可能會導致Failure。但軟體內部也可以處理好該Error,避免發生 Failure。

Fault 缺陷

缺陷是指造成錯誤的原因。通常需要經過判斷、假設才能夠得出。依照產生原因通常有兩類

By 原因(重點)

  • 設計缺陷 Design Fault:也就是 bug,通常是內因性的。在軟體開發過程中所造成的問題。例如寫錯判斷式、誤解需求、除數為0、演算法設計錯誤、類別設計錯誤、忘記初始化物件。除非有開發人員主動去修正,否則不會自行消失。
    • 解法:code review, 單元測試, 靜態程式碼檢查, pair programming等等以提高開發流程品質為主
  • 元件缺陷 Component Fault:通常是外因性的,原本是指硬體元件因為老化或是受到使用環境影響產生的問題。引申為軟體元件在與執行環境互動時,產生的不正常狀況。例如:網路線鬆動、記憶體不足、存檔時發現硬碟空間不足、列印時印表機沒開、無法存取遠端的信用卡交易服務。
    • 解法:設計本身沒有問題,而是與外界互動時出問題,需要透過例外處理來修復。

By 時間頻率分類,有可能是

  • 暫時性的,像是網路問題
  • 間歇發生的,記憶體洩漏,重開機就會好,但一段時間會再出現
  • 永久發生的,除非將有問題的元件換掉,否則會一直壞掉,例如系統邏輯有bug。

Exception 例外

程式語言中用來表達 Error 與 Failure 的概念,有可能是指「程式處於錯誤狀態」,也有可能是「程式沒辦法達成預期的行為」。

舉例:我們自行寫了一個 writeFile 函數,在函數內部呼叫 system call 時,發生 IOException ,這個例外對 writeFile 函式本身來說,是個 Error。接著例外往外傳播到 writeFile 的呼叫者,呼叫者發現這個函式沒辦法達成預期的行為,所以是個 Failure。

總結

大致上,整個關係可以視為下面這張圖