2012-04-06 21 views
3

讓我們假設你讀了一個大的XML文件,大約25%的節點是可選的,所以你真的不在乎它們是否在那裏,但是,如果它們提供給你,你仍然可以閱讀它們,做一些與他們(例如存儲在一個數據庫)。這是空的try catch塊的情況嗎?

由於它們是可選的,在這種情況下將它們封裝在空的try . . . catch塊中是不是可以,所以如果它們不在那裏,程序會繼續執行?你不關心拋出錯誤或類似的東西。

請記住,只是因爲它們是可選的並不意味着你不想檢查它們。這僅僅意味着向您提供XML的人不希望您知道某些信息,或者他們希望您知道,並由您來處理。

最後,如果這只是幾個節點,這不會有什麼大不了的,但是如果您有100個節點是可選的,例如,檢查每個節點是否首先是null還是暫停如果發現null,那麼執行,因此我問爲什麼這是空嘗試catch語句的正當理由的原因。

+6

請勿將異常用於流量控制。把空的支票放在裏面。 – cadrell0 2012-04-06 20:44:45

+0

@ cadrell0 - 這是我的觀點之一,如果有幾個空檢查,那很好,但如果你有100個檢查。 – Xaisoft 2012-04-06 20:45:54

+3

@ Xaisoft然後放入100s – cadrell0 2012-04-06 20:46:18

回答

5

如果處理節點X是可選的,然後你的代碼應該看起來像:

if(node X exists in file) 
{ 
    do work with X 
} 

,而不是:

try 
{ 
    do work with X 
} 
catch{} 

現在,如果沒有辦法來確定是否節點X存在比其他嘗試使用它,或者如果在檢查節點X是否有可能之後刪除節點X,那麼您不得不使用try/catch模型。這不是這裏的情況。 (與之相反,在閱讀文件之前檢查文件是否存在;有人可以在檢查文件後檢查它是否存在)

---------------- --------------------------------------------

編輯:

因爲看起來您的問題是訪問節點「grandchild」在下面的XML中可能不存在'父'。 (請原諒我在SO中渲染這種XML的能力差;知識豐富的讀者可以自由地以適當的格式編輯。)

<root> 
    <Parent> 
    <Child> 
     <GrandChild> 
     The data I really want. 
     </GrandChild> 
    </Child> 
    </Parent> 
</root> 

對於我會做這樣的事情:

public static class XMLHelpers 
{ 
public static Node GetChild(this Node parent, string tagName) 
{ 
    if(parent == null) return null; 
    return parent.GetNodeByTagName(tagName); 
} 
} 

然後,你可以這樣做:

var grandbaby = rootNode.GetChild("Parent").GetChild("Child").GetChild("GrandChild"); 
if(grandbaby != null) 
{ 
    //use grandbaby 
} 
+0

...是的,擴展解決了優雅。 – NSGaga 2012-04-06 21:12:55

1

因爲它們是可選的,是不是就OK了在這種情況下包起來 空的try catch塊,以便在即使是它們不存在,則 程序只是繼續執行。

否 - 相反,您應該在做其他事之前檢查特定節點是否存在。由於您的期望有時候,您的程序邏輯應該涵蓋這一點,這不是異常處理的用例。

+0

這是修辭問題,但是嵌套節點呢,比如說有10個或更多嵌套節點,不會導致一個大的結果如果是null,如果是null,如果是.... ....語句。 – Xaisoft 2012-04-06 20:48:36

+0

@Xaisoft並非如此。你只是將if檢查嵌套在對方內部。如果(有(A)){如果(有(B)){使用A + B}}(請不要在SO評論中使用換行符。) – Servy 2012-04-06 20:50:50

+0

@Servy - 你有一個觀點,我想它是開始時只有一種痛苦,對吧? – Xaisoft 2012-04-06 20:51:39

2

一般場景聽起來像使用一個邊緣的情況下接受空的catch塊(當然假設catch的範圍是沒有節點時拋出的異常的類型)。由於如果節點不存在,您沒有任何工作要做,那麼代碼執行將按計劃繼續。

我的確質疑在這裏檢查null是否太痛苦。代碼/痛苦的檢查空量是2線

if (parent.IsPresente("child")) { 
    var child = parent.GetNode("child"); 
} 

一個try/catch的開銷,雖然是一樣冗長

try { 
    DoSomething(parent.GetNode("child")); 
} catch (TheExceptionType) { } 

鑑於這種選擇,我會選擇if方法。這同樣是陳述性的,總的來說速度更快,總體來說更好的風格。例外應該只用於特殊情況。手無法預防的東西。這是一種非常可預防的情況,甚至可能通過支持該模式的擴展方法使其更加可口

XmlNode child; 
if (parent.TryGetNode("child", out child)) { 
    .. 
} 
+0

是的,程序的執行不依賴於節點。當我說疼痛時,我的意思是擁有100個嵌套節點的可能性,這會導致一個巨大的嵌套if語句。 – Xaisoft 2012-04-06 20:50:58

+0

@ Xaisoft好的,我想我看到這裏的情況稍好一點。你基本上說它不是一系列的sybling節點,而是一個深度嵌套的遍歷。 – JaredPar 2012-04-06 20:52:25

+0

@Xaisoft我們需要了解更多關於該程序的嘗試,以嘗試任何類型的泛化,但是例如JaredPar的代碼中DoSomething可以正常工作,即使傳入null也可以將空檢查移動到一個輔助方法而不是100打電話給它。 – Servy 2012-04-06 20:52:38