3

大きなXMLファイルを読み込んで、ノードの約25%がオプションであると仮定します。したがって、ノードが存在するかどうかは気にしませんが、ノードが提供されている場合でも、ノードを読み込んで何かを実行します。それらと一緒に(たとえば、それらをデータベースに保存します)。

オプションなので、この場合は空のtry . . . catchブロックでラップしても大丈夫ではないので、そこにない場合でもプログラムは実行を継続しますか?エラーなどをスローする必要はありません。

それらがオプションであるからといって、それらをチェックしたくないという意味ではないことに注意してください。これは、XMLを提供する人が特定の情報を知られたくないか、知ってほしいと思っていることを意味し、それを処理するのはあなた次第です。

最後に、これがほんの数ノードの場合、大したことではありませんが、たとえばオプションのノードが100個ある場合、各ノードが最初であるかどうかを確認したり、が見つかっnullた場合は実行を停止したりするのは面倒です。nullしたがって、これが空のtrycatchステートメントの正当な理由であるかどうかを尋ねた理由。

4

3 に答える 3

5

ノードXの処理がオプションの場合、コードは次のようになります。

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

ではなく:

try
{
  do work with X
}
catch{}

ノードXを使用する以外にノードXが存在するかどうかを判断する方法がない場合、またはノードXが存在するかどうかを確認した後でノードXを削除できる場合は、try/catchを使用する必要があります。モデル。それはここの状況ではありません。(言うのとは対照的に、ファイルを読み取る前にファイルが存在するかどうかを確認します。ファイルが存在するかどうかを確認した後、誰かがそのファイルを削除できます。)

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

編集:

あなたの問題は、「親」が存在しない可能性のある次のXMLのノード「孫」だけにアクセスすることであるように思われるためです。(このXMLをSOでレンダリングする能力が低いことをお許しください。知識のある読者は、適切な形式で自由に編集してください。)

<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
}
于 2012-04-06T20:46:32.800 に答える
2

一般に、シナリオは、空のcatchブロックを使用するための境界線で許容できるケースのように聞こえます(もちろん、catchが、ノードがない場合にスローされる例外のタイプにスコープされていると仮定します)。ノードが存在しない場合は何もする必要がないため、コードの実行は計画どおりに続行されます。

nullここでは、チェックの苦痛が大きすぎるかどうか疑問に思います。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)) {
  ..
}
于 2012-04-06T20:47:59.243 に答える
1

これらはオプションなので、この場合は空のtry catchブロックでラップしても問題ありません。そのため、それらが存在しない場合でも、プログラムは実行を続行します。

いいえ-代わりに、他のことを行う前に、特定のノードが存在するかどうかを確認する必要があります。これが当てはまることがあると予想されるため、プログラムロジックでこれをカバーする必要があります。これは、例外処理のユースケースではありません。

于 2012-04-06T20:45:29.087 に答える