2

私は例外に頭を悩ませようとしています。それ以上に、彼らができること、さらに重要なことは、彼らがすべきこととすべきでないことを推測しています。

それで、私がかなり特定の問題についてどのように考えているかの例を見ていき、人々が私が持っているアイデアを祝福するか、打ちのめすようになることを願っています。

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!
}

それが何らかの意味をなすか、少なくとも私の思考の流れをたどることができることを願っています。例外がどのように使用されるのかということではないと思います。

私の質問は、これによって2つに折りたたまれていると思います。

1)例外はこのように使用できますか、それともこれは悪い考えですか?2)妥当性をチェックする際にすべてが肥大化していないコードを取得するために、通常、C ++でこれをどのように実行しますか?

ありがとう。

4

2 に答える 2

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");
... 
于 2012-11-27T18:01:01.607 に答える
3

このような方法で使用される例外を時々見たことがありますが、特に、さまざまな設定をすべて実行するか、手動でどこを追跡する必要があるように思われるため、ここでは必要または望ましいとは思いません。停止。

どうですか

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

attribute_value存在するかどうかを判断するためのロジックはどこに含まれますか"attr1"

于 2012-11-27T18:01:06.850 に答える