2012-11-27 49 views
2

我想繞過異常和更多我猜想他們可以做什麼,甚至更重要他們應該做什麼,不應該做什麼。也許我誤解了C++異常?

因此,我將以一個例子說明我是如何思考一個非常具體的問題,並希望人們會祝福或抨擊我所擁有的想法。

我正在讀取一個xml文件的設置,所以我可能有設置,但也有一些情況下,具體的設置可能不在那裏,這會產生一些麻煩和大量的「錯誤處理「或稱之爲類型: (注意:這不是」真正的代碼「,而只是一些僞造的東西,希望能夠說明我的觀點)。

if (xml.attribute("some_attrib")) { 
    settingForSomeAttrib = xml.attribute("some_attrib")->value(); 
} else { 
    settingForSomeAttrib = "some default value"; 
} 

因此,這將留下我一檢查,讓每個人都能分配或多或少和任何我想要做的,這是不可取的。

然後我在想,也許我可以完成所有的工作,取出任何出錯的東西,並將其傳遞給默認值,稍微嘗試一下就可以解決問題,後處理..

帶領我到try/catch類型的思維。

我想,然後也許我可以做一個try塊:

try { 
    setting1 = xml.attribute("attr1")->value(); // throws some kind of "attr1" exception? 
    setting2 = xml.attribute("attr2")->value(); // -||-    "attr2" exception? 
} catch (???) { 
    //go through the things which went wrong and set them settings straight! 
} 

希望這是某種感覺,或者至少,它可能按照我的思路。我覺得這不是真的如何使用例外。

我在想,我的問題是怎麼樣兩本摺疊:

1)可用這樣的例外或這僅僅是一個壞主意? 2)人們通常如何通過C++來獲取這些代碼,以便在檢查有效性時獲得不是所有的代碼?

謝謝。

+5

我肯定不會使用異常來處理僅僅是可選的設置。 – NPE

+1

在你的'try/catch'例子中,如果'settings1'行產生一個異常,那麼由於這個異常,下面的所有行都不會被執行。所以你只需在每個屬性get的周圍放一個'try/catch',這與你上面的'if/else'相同。我會做的是首先初始化所有東西,然後通過嘗試從XML中拉出來運行,如果值不存在,則無關緊要。編輯:我也喜歡下面的@NPE例子。 – themanatuf

+1

一般情況下,使用意外情況(或者,我敢說,例外情況)出現異常。您應該期望可選屬性丟失,所以這不是一個特殊情況。 –

回答

5

我肯定不會使用異常來處理僅僅是可選的設置。

相反,我會做一些大意如下:

string getString(const XML& xml, const string& attrib, const string& defaultAttrib) { 
    if (xml.attribute(attrib)) { 
    return xml.attribute(attrib)->value(); 
    } else { 
    return defaultAttrib; 
    } 
} 

... 
setting1 = getString(xml, "attrib1", "attrib1_default"); 
... 
+0

'default'是一個關鍵字,不能在switch語句之外使用,儘管VC++允許它(可能將其視爲上下文關鍵字)。無論如何,這個解決方案效果很好,因爲可以提供一個沒有'defaultAttrib'參數的重載,而在'else'分支中則會拋出一個異常。 – GManNickG

+0

@GManNickG:良好的捕獲重複'默認',謝謝(奇怪的是,我有它叫別的,但後來決定縮短名稱爲'默認',使聲明適合在代碼框中......德哦!: - )) – NPE

+0

非常有幫助,那真的給了我想要的乾淨的實現,並且處理錯誤,沒有我以臃腫的代碼結束。感謝那。 – qrikko

3

我偶爾看到以這種方式使用的例外情況,但我不認爲這是必要的或希望在這裏,特別是因爲您似乎必須經歷所有各種設置,或者手動跟蹤停止的位置。

如何

setting1 = attribute_value(xml, "attr1", default1); 
setting2 = attribute_value(xml, "attr2", default2); 

其中attribute_value將包括邏輯,以找出是否存在"attr1"