今天下班之前整理了一下Teddy發表在部落格上關於例外處理的文章，一共有32,557個字。雖然Teddy很想在今年底之前寫完《設計模式的逆襲》這本書，但是看到部落格上例外處理的文章比設計模式的還要多，此時Teddy便有點猶豫了，到底是要先寫比較不好寫但應該比較有「錢途」的《設計模式的逆襲》，還是讓Teddy的「法定專長」《例外處理設計的逆襲》先插隊哩。好難抉擇啊 。
先不想那麼多了，什麼資料比較完整，就先寫什麼吧。Teddy在2007年12月寫了《例外處裡 (2)：名詞解釋》，解釋了例外處理設計領域很重要且容易混淆的四個觀念：fault、error、failure、exception，今天用一張圖來補充說明一下，看了圖之後就比較容易了解這四者的關係。雖然上圖由右至左、由上至下的順序是fault、error、failure、exception，但解釋這些觀念用相反的順序比較容易理解。
Failure（失效）指的是一個系統或軟體元件（function、method、service）的行為偏離其原先定義好的規格 (specification)。例如：
int add(int first, int second)這個function，傳入1和5這兩個參數。在正常情況下應該要回傳6，如果傳回6以外的任何答案，都算是add()這個function失效。
一個網路購物系統，所有的線上扣款動作都必須在60秒之內完成。如果超過60秒尚未完成則視為扣款功能失效。
一個客戶關係管理系統要連到後端資料庫讀取使用者登入帳號與密碼，但是網路不穩導致連線斷斷續續，系統登入功能無法使用，使用者登入失敗。
Error（錯誤）指的是系統或軟體元件內部處於錯誤狀態(erroneous state)。當error發生的時候，如果系統或軟體元件可以加以修復，回到一個沒有error的正確狀態，則就可以避免發生failure。反之error則會導致failure。一個最常見的例子就是資料庫交易處理（transaction processing）。當交易處理失敗，例如某個table的資料被別人鎖住或是要刪除的資料已被其他人給刪除，此時的資料庫內部狀態是不正確的（error 發生）。但只要rollback此筆交易，讓資料庫回到正確的狀態，則failure就不會發生。
Fault（缺陷）可以區分為兩大類：design fault（設計缺陷）和component fault（元件缺陷）。
Design fault又稱為defect或bug，是人類在軟體開發過程中所犯下的錯誤。例如，忘記初始化物件、把除數設定為零、演算法設計錯誤等。
Component fault則是指軟體元件與軟體元件之間，或是軟體元件與執行環境之間互動時所產生的不正常情況。例如，一個原本運作正常的網路連線忽然中斷、儲存資料時發現硬碟空間不足、列印檔案時印表機未開啟等等。
軟體系統若是存在著fault，在系統執行期間如果執行到這些fault所屬的程式，則將會導致error發生。在開發軟體時，除非考慮到design fault與component fault所可能導致的error並加以處理修復，否則error將進一步使得軟體產生failure。
在支援Exception（例外）概念的程式語言中（例如Java、C#），則是使用exception來表示error與failure。當程式語言的執行環境發生到fault的時候，會產生一個exception物件來代表這個fault。例如Java語言的BufferOverflowException、NoSuchElementException、NullPointerException。如果這些error沒有被處理，最後導致某一個method執行失敗，則該執行失敗的method可以丟出一個自己定義的FailureException例外用來表示failure。
友藏內心獨白：看完 寫完之後頭好暈啊…Orz。
是不是 由左至右 比較好。