我试图绕过异常,我想他们可以做些什么,更重要的是他们应该做什么和不该做什么。
所以,我将举一个例子,说明我如何思考一个非常具体的问题,希望人们能够祝福或抨击我所拥有的想法。
我正在读取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 ++中使用这些来获取在检查有效性方面并非臃肿的代码?
感谢。
答案 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"
是否存在的逻辑。