[Chatter] 錯誤處理的安全保證等級

摘要:[Chatter] 錯誤處理的安全保證等級

在撰寫程式的時候,錯誤處理是一件很重要的事情。在「C++編程規範」這本書的第71個條款裡,依照不同的錯誤處理結果,定義出三種「安全保證」等級: No-fail保證、Strong保證、Basic保證。這三種安全保證等級以執行方法遇到錯誤並且處理之後,是否會影響到資料或狀態來做等級區分。開發人員在撰寫每個方法之前,先決定方法的錯誤處理是屬於哪個等級,可以減少思考的範圍、避免一些不必要的過度設計。


No-fail保證

所謂的「No-fail保證」是說:執行方法一定成功、不會發生異常。在系統裡有些方法,必須設計為提供No-fail保證等級,例如:解構子、資源釋放、Log紀錄…等等。這些方法通常會在錯誤處理時使用,如果錯誤處理時又會出錯,那應該就是開發人員的災難了。


以開發人員的角度來說,會希望所有方法都是No-fail保證等級。不過很殘酷的現實是,大多數的方法都會發生異常、需要錯誤處理。


Strong保證

所謂的「Strong保證」是說:執行方法不一定成功、但異常處理之後狀態或資料不變。系統裡最常見設計為提供Strong保證等級的方法,就是使用「交易功能」的資料庫操作方法。當執行資料庫操作方法發生異常的時候,系統會Rollback資料庫,讓資料庫維持呼叫方法之前的狀態。


以開發人員的角度來說,應該要盡量設計方法到達Strong保證等級。方法執行的結果,要不就是正常執行完畢、要不就是發生異常可是資料或狀態不變。


Basic保證

所謂的「Basic保證」是說:執行方法不一定成功、但異常處理之後的狀態或資料是在「可接受範圍」裡。這邊的可接受範圍是指資料或狀態的正確性,例如說:一台轎車最多只能坐五個人,結果執行方法發生異常後,在資料庫裡留下了六個人的紀錄,這就是資料不在可接受範圍裡。


以開發人員的角度來說,Basic保證等級是方法必須滿足的最低等級。當方法執行發生異常,可是異常處理之後的狀態或資料不在可接受範圍裡,這樣的執行結果應該歸類為程式的Bug,必須要重新設計。因為方法執行發生異常之後,如果資料或狀態無法保證在可接受範圍裡,那只會引發蝴蝶效應產生更多的錯誤。


期許自己
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。