3 回答

TA貢獻1876條經驗 獲得超7個贊
我喜歡錯誤作為返回值方式。如果您正在設計api并且想要盡可能輕松地使用您的庫,請考慮以下添加:
將所有可能的錯誤狀態存儲在一個typedef'ed枚舉中,并在lib中使用它。不要只返回整數或更糟,混合整數或不同的枚舉與返回代碼。
提供將錯誤轉換為人類可讀的東西的功能??梢院芎唵?。只是錯誤枚舉,const char * out。
我知道這個想法使多線程使用有點困難,但如果應用程序員可以設置全局錯誤回調那就太好了。這樣他們就可以在bug追捕會話期間將斷點放入回調中。
希望能幫助到你。

TA貢獻1842條經驗 獲得超22個贊
我已經使用了這兩種方法,它們對我來說都很好。無論我使用哪一個,我總是嘗試應用這個原則:
如果唯一可能的錯誤是程序員錯誤,請不要返回錯誤代碼,在函數內部使用斷言。
驗證輸入的斷言清楚地傳達了函數所期望的內容,而過多的錯誤檢查會使程序邏輯模糊不清。決定如何處理所有各種錯誤情況可能會使設計復雜化。為什么要弄清楚函數X應該如何處理空指針,如果你可以堅持程序員永遠不會傳遞一個?

TA貢獻1883條經驗 獲得超3個贊
CMU的CERT 有一套很好的幻燈片,建議何時使用每種常見的C(和C ++)錯誤處理技術。最佳幻燈片之一是這個決策樹:
我會親自改變關于這款跑車的兩件事。
首先,我要澄清有時對象應該使用返回值來指示錯誤。如果函數僅從對象中提取數據但不改變對象,則對象本身的完整性不存在風險,并且使用返回值指示錯誤更合適。
其次,在C ++中使用異常并不總是合適的。異常是好的,因為它們可以減少用于錯誤處理的源代碼量,它們通常不會影響函數簽名,并且它們可以非常靈活地傳遞callstack的數據。另一方面,由于以下幾個原因,異常可能不是正確的選擇:
C ++異常具有非常特殊的語義。如果你不想要那些語義,那么C ++異常是一個糟糕的選擇。拋出后必須立即處理異常,并且設計有利于錯誤需要將調用堆棧展開幾個級別。
拋出異常的C ++函數以后不會被包裝成不拋出異常,至少在沒有支付異常的全部代價的情況下也是如此??梢园祷劐e誤代碼的函數以拋出C ++異常,從而使它們更加靈活。C ++
new
通過提供非投擲變體來實現這一目標。C ++異常相對較為昂貴,但這種缺點主要是對于合理使用異常的程序而言過于夸張。程序根本不應該在性能受到關注的代碼路徑上拋出異常。程序報告錯誤和退出的速度并不重要。
有時C ++異常不可用。要么它們在一個人的C ++實現中根本不可用,要么一個代碼指南禁止它們。
由于最初的問題是關于多線程的上下文,我認為本地錯誤指示器技術(在SirDarius的答案中描述的內容)在原始答案中被低估了。它是線程安全的,不會強制錯誤被調用者立即處理,并且可以捆綁描述錯誤的任意數據。缺點是它必須由一個對象保持(或者我想以某種方式與外部相關聯)并且可以說比返回代碼更容易被忽略。
- 3 回答
- 0 關注
- 581 瀏覽
添加回答
舉報