3 回答

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

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
我已經(jīng)使用了這兩種方法,它們對(duì)我來(lái)說(shuō)都很好。無(wú)論我使用哪一個(gè),我總是嘗試應(yīng)用這個(gè)原則:
如果唯一可能的錯(cuò)誤是程序員錯(cuò)誤,請(qǐng)不要返回錯(cuò)誤代碼,在函數(shù)內(nèi)部使用斷言。
驗(yàn)證輸入的斷言清楚地傳達(dá)了函數(shù)所期望的內(nèi)容,而過(guò)多的錯(cuò)誤檢查會(huì)使程序邏輯模糊不清。決定如何處理所有各種錯(cuò)誤情況可能會(huì)使設(shè)計(jì)復(fù)雜化。為什么要弄清楚函數(shù)X應(yīng)該如何處理空指針,如果你可以堅(jiān)持程序員永遠(yuǎn)不會(huì)傳遞一個(gè)?

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