C++ 也许我';我误解了C++;例外情况?
我试着把我的头脑集中在异常上,我猜他们能做什么,更重要的是他们应该做什么和不应该做什么 因此,我将举一个例子来说明我是如何思考一个非常具体的问题的,并希望人们会支持或抨击我的想法 我正在读取xml文件的设置,所以我可能有设置,但也有特定设置可能不在其中的情况,这会产生一些问题和大量的“点错误处理”或如何称呼它,类型如下: (注意:这不是“真正的代码”,只是一些伪代码,希望能说明我的观点) 因此,这将给我留下一张支票和一份或多或少的任务——以及我想做的任何事情,这是不可取的 然后我在想,也许我可以把所有的东西都检查一遍,找出任何出错的东西并把默认值交给它,稍微试着把它弄对,然后再处理任何不成功的东西 使我产生了一种C++ 也许我';我误解了C++;例外情况?,c++,xml,exception,error-handling,C++,Xml,Exception,Error Handling,我试着把我的头脑集中在异常上,我猜他们能做什么,更重要的是他们应该做什么和不应该做什么 因此,我将举一个例子来说明我是如何思考一个非常具体的问题的,并希望人们会支持或抨击我的想法 我正在读取xml文件的设置,所以我可能有设置,但也有特定设置可能不在其中的情况,这会产生一些问题和大量的“点错误处理”或如何称呼它,类型如下: (注意:这不是“真正的代码”,只是一些伪代码,希望能说明我的观点) 因此,这将给我留下一张支票和一份或多或少的任务——以及我想做的任何事情,这是不可取的 然后我在想,也许我可以
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++中进行这样的操作,以获得在检查有效性时不臃肿的代码?
谢谢。我当然不会使用异常来处理仅仅是可选的设置 相反,我会按照以下思路做一些事情:
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");
...
我偶尔会看到以这种方式使用异常,但我不认为这是必要的或可取的,特别是因为您似乎必须通过所有各种设置,或手动跟踪您停止的位置 怎么样
setting1 = attribute_value(xml, "attr1", default1);
setting2 = attribute_value(xml, "attr2", default2);
其中
attribute\u value
包含了判断“attr1”
是否存在的逻辑。我当然不会使用异常来处理仅仅是可选的设置。在try/catch
示例中,如果settings1
行生成异常,然后,由于异常,将不会执行以下所有行。因此,您只需在每个属性get周围放置一个与上面的if/else
相同的try/catch
。我要做的是首先初始化所有内容,然后尝试从XML中提取,如果该值不存在,则无所谓。编辑:我也喜欢下面的@NPE示例。一般来说,在意外(或者,我敢说,异常)情况下使用异常。你应该期望可选属性丢失,所以这不是一个例外情况。谢谢,这正是我需要听到的,还有我觉得已经准备好的答案:)例外应该在例外情况下使用。线索在名称中。default
是一个关键字,不能在switch语句之外使用,尽管VC++允许(可能将其视为上下文关键字)。无论如何,这个解决方案工作得很好,因为可以提供一个没有defaultAttrib
参数的重载,而在else
分支中抛出一个异常。@GManNickG:Good catch redefault
,谢谢(奇怪的是,我让它调用了其他名称,但后来决定将名称缩短为default
,以使声明适合于代码框…d'oh!:-)非常有用,这确实为我提供了我想要的干净实现,并且在处理错误时不会导致代码膨胀。谢谢你。
setting1 = attribute_value(xml, "attr1", default1);
setting2 = attribute_value(xml, "attr2", default2);