(轉)函數返回設計以及錯誤處理

本文屬spanzhang(張友邦)原創,發佈地址爲:http://blog.csdn.net/spanzhang

  今天在閒逛的時候發現一篇文章,zhuweisky寫的《函數設計之美--函數需要返回錯誤碼嗎(一)?》(http://blog.csdn.net/zhuweisky/archive/2005/09/08/475355.aspx)。文章主要對函數返回錯誤碼一事進行了討論,作者最後給出的觀點是採用契約式的前置約束而不是返回錯誤碼來使得設計變得更加優雅。

  我對這個問題也關心很久了,一直沒來得及整理思路。應該說這是一個非常普遍的設計問題,很多人都在這個問題前犯過難。我覺得對於函數返回值的設計以及錯誤處理應該和團隊習慣以及開發工具有很大關係,個人不推薦契約式的前置約束。我對契約式設計沒有深入地研究過,但可以想象,運行時的契約檢查如果不成立同樣也會涉及到錯誤處理(有可能是拋出異常),所以薦契約式的前置約束實際上是換湯不換藥。但我在zhuweisky的文章中看到的代碼沒有在函數前置約束的Meta Data中指定契約不滿足時的處理辦法,語言級的支持沒辦法在編譯的時候提供任何運行時保證。

  對於C++開發語言,我個人推薦採用返回值的方式來表達運行結果情況而用out參數(指針或引用)承載實際內容。對簡單的情況,返回值可以是bool類型,但更多的時候推薦使用枚舉(或int)。任何函數在執行之初對傳入參數和運行環境的基本檢查是必需的,這是一個非常好的習慣。之所以我這樣認爲,是因爲C/C++的歷史原因導致。而對於Java來說就更多的推薦使用異常機制來處理錯誤和約束。但函數約束檢查都是必須的,它能在局部保證函數的正常運行。

  zhuweisky在文中提到的一句話我非常贊同:不要讓錯誤傳播(出現),在錯誤出現的發源地(萌芽期)就解決它!錯誤越是傳播到最後,關於處理它的上下文就丟失得越多,對於錯誤的蔓延就越是愛莫能助!這也正是約束檢查的證據,同時結合分層的設計讓錯誤呈現出層次結構,對每一層的錯誤處理都是必需的。

發佈了37 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章