2012-10-05 126 views
3

我開始用C++寫一些代碼,我有一個簡單的任務管理器程序我正在寫做實驗這個簡單的類方法:C++良好的錯誤處理方法

void Task::setText(string text) 
{ 
    if(text.length() > MIN_LENGTH) 
    { 
     this->text = text; 
    } 
} 

正如你所看到的,如果該方法的長度高於在我已展示的代碼上方定義的MIN_LENGHT變量,則此方法將類text屬性設置爲傳遞給該方法的屬性。所以我必須做一些事情,如果條件不傳遞給方法的字符串評估爲true。

在我購買的C++書籍中,錯誤處理沒有解釋,而是它只是在全球各地使用assert。如果表達式爲false,斷言程序會中止程序,並將其作爲輸入驗證,我尋找更好的方法。

該搜索引導我到C++ exceptions。在那裏它解釋瞭如何創建一個繼承自exception的類來創建異常。

良好的面向對象操作規範說每個類都應該獨立於程序中的其他類。那麼我應該在哪裏創建這個異常類?在同一個頭文件中,我定義了我的Task類?或者應該在task.cpp中定義每個類的方法?

也許這是一個愚蠢的問題,但只是想要安全並從一開始就遵循一個好的軟件架構實踐。

+1

「我沒有做你所要求的」與「你搞砸了」不一樣。傳遞的字符串太短,可能會終止程序?您首先必須決定在這種情況下呼叫方應該做些什麼。然後你可以考慮如何傳輸必要的信息。 –

回答

6

建議#1:你需要完全讀你的書。

如果發生錯誤,您應該拋出異常。每1000次調用函數/方法時,異常發生的次數會少一些。在這裏1000不是一個魔術值,特別是其他數字可能是合適的。

換句話說。您需要回答的第一個問題:這種錯誤發生的頻率。如果這可能經常發生,那麼返回值(bool或枚舉或int)是更好的方法。

如果您決定使用異常,最好從std::exception中派生出來。您應該將項目的例外情況置於單獨的文件中。想想幾個班,也許3-10。最好在你的異常類中放置一個數據字段,它應該解釋所發生的事情的細節,而不是創建數百個不同的異常類。

+2

雖然我同意這個答案,但我想指出''assert'用於識別PROGRAMMER錯誤的目的(比如,除非代碼錯誤,否則不應該發生的事情),因爲它們在發佈時編譯時被禁用,應該用來處理來自用戶的錯誤。在你的情況下,你應該問的問題是「如果字符串比它應該短,是錯誤還是可以發生,因爲用戶輸入了錯誤的東西,或者因爲文件不存在等。」 – qdii

+0

+1,建議少用例外。而且,如果可以的話,另一個+1用於推薦它們在單獨的標題中定義。您應該仔細考慮適用於您的程序的錯誤類別,並創建捕獲它們的極少數的異常類。你應該從':: std :: exception'或者它的一個子分類派生,比如':: std :: invalid_argument'。 – Omnifarious

+0

@qdii:關於'assert'的優點。恐怕我的編輯模糊了這樣一個事實,即原始文章似乎有點含糊不清爲什麼條件可能會失敗。 OP在幾處提到了「驗證」,所以我假設了「輸入驗證」。 – Omnifarious

0

C++標準庫提供了許多可以使用的exception類。開始時,您可以使用它們。在你的情況下,似乎是range error
如果你仍然想實現你自己的異常類,你聲明和實現它應該取決於他們的代碼。如果他們編寫了一個類特定的錯誤,你可以把它們放在你的類文件中。如果你必須從多個文件中使用它們,把它們放在它們自己的.cpp/.hpp對中。

1

異常類可以在單獨的.h .cpp文件中。這樣你可以重用其他東西。

至於我自己的經驗法則:

斷言是事情不應該發生,但我們檢查只是爲了確保100%地肯定

例外是錯誤處理的事情時,你的程序是可以發生在生產