2

我试图将我的头脑围绕着异常,我猜想他们可以做什么,更重要的是他们应该做什么和不应该做什么。

所以,我将举一个例子来说明我是如何思考一个非常具体的问题的,并希望人们会祝福或抨击我的想法。

我正在从 xml 文件中读取设置,所以我可能有这些设置,但也存在特定设置可能不存在的情况,这会产生一些麻烦和很多“点错误处理”或者叫什么,类型:(注意:这不是“真正的代码”,而只是一些伪代码,希望能说明我的观点)。

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

所以这会让我或多或少地为我想做的每件事和任何事情留下支票和分配,这是不可取的。

然后我在想,也许我可以通过这一切,获取任何出错的东西并将其交给默认值,有点只是尝试让它正确,任何不成功的东西我们会在之后处理..

引导我进行一种try/catch思考。

然后我在想也许我可以做一个尝试块:

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++ 中进行此操作以获取在检查有效性时并不臃肿的代码?

谢谢。

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); 

whereattribute_value将包含判断是否"attr1"存在的逻辑。

于 2012-11-27T18:01:06.850 回答