也许我错过了解C ++ Exceptions?

时间:2012-11-27 17:57:06

标签: c++ xml exception error-handling

我试图绕过异常,我想他们可以做些什么,更重要的是他们应该做什么和不该做什么。

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

我正在读取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 ++中使用这些来获取在检查有效性方面并非臃肿的代码?

感谢。

2 个答案:

答案 0 :(得分: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");
... 

答案 1 :(得分:3)

我偶尔会看到以这种方式使用的例外情况,但我认为这不是必要或不可取的,特别是因为您似乎必须完成所有各种设置或手动跟踪你停在哪里。

怎么样

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

其中attribute_value将包含判断"attr1"是否存在的逻辑。