Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 也许我';我误解了C++;例外情况?_C++_Xml_Exception_Error Handling - Fatal编程技术网

C++ 也许我';我误解了C++;例外情况?

C++ 也许我';我误解了C++;例外情况?,c++,xml,exception,error-handling,C++,Xml,Exception,Error Handling,我试着把我的头脑集中在异常上,我猜他们能做什么,更重要的是他们应该做什么和不应该做什么 因此,我将举一个例子来说明我是如何思考一个非常具体的问题的,并希望人们会支持或抨击我的想法 我正在读取xml文件的设置,所以我可能有设置,但也有特定设置可能不在其中的情况,这会产生一些问题和大量的“点错误处理”或如何称呼它,类型如下: (注意:这不是“真正的代码”,只是一些伪代码,希望能说明我的观点) 因此,这将给我留下一张支票和一份或多或少的任务——以及我想做的任何事情,这是不可取的 然后我在想,也许我可以

我试着把我的头脑集中在异常上,我猜他们能做什么,更重要的是他们应该做什么和不应该做什么

因此,我将举一个例子来说明我是如何思考一个非常具体的问题的,并希望人们会支持或抨击我的想法

我正在读取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 re
default
,谢谢(奇怪的是,我让它调用了其他名称,但后来决定将名称缩短为
default
,以使声明适合于代码框…d'oh!:-)非常有用,这确实为我提供了我想要的干净实现,并且在处理错误时不会导致代码膨胀。谢谢你。
setting1 = attribute_value(xml, "attr1", default1);
setting2 = attribute_value(xml, "attr2", default2);