错误处理:区分'fatal'错误和'意外输入'错误
Error handling: distinguishing between 'fatal' errors and 'unexpected input' errors
我一直在编写一个读取XML文件的程序,如果ifstream无法打开该文件,它将抛出std::ifstream::失败。当std::ifstream::failbit或std::ifstream::badbit被设置时,这个异常就会被抛出,它们是(至少在我看来)需要进行异常处理的错误类型。
打开文件后,我使用RapidXML创建DOM对象,如果解析失败,它的解析函数将抛出RapidXML::parse_error。在这种情况下,错误并不是致命的——它只是错误的输入。无论如何,我认为rapidxml在解析xml文件失败时抛出异常仍然是公平的,但即使我不这么认为,这也无关紧要,因为我没有太多的选项。我可以在RapidXML中关闭异常,但这样我仍然必须手动处理这些异常情况,通过异常机制处理它们要容易得多。然而,这绝对是一个模糊的领域;使用rapidxml::parse抛出异常的理由不像ifstream那样明确。
最后一种情况是当我解析DOM时遇到一个意外的或未预料到的节点。显然,尽管有意外输入,程序仍然可以继续执行,但我不希望它这样做。我可以在这里抛出一个异常,但我不确定这样做是否有意义。
所以,我请求一些建议:异常处理的一些最佳实践是什么?我尝试在类中使用RAII习惯用法,通过在构造函数中执行所有这些操作来解析文件。我使用boost::shared_ptr实例化文件解析类,所以如果构造函数抛出,boost::shared_ptr将在删除文件解析类后重新抛出std::bad_alloc。
当XML文件不符合该类所期望的内容时,我可以提出这样的理由,并且我认为在出现意外输入时抛出异常是有意义的,但是我真的只想确保我的思维过程是正确的。
您的设计对我来说很有意义:完全初始化或抛出异常。唯一能想到的替代方案是:
- 状态代码
- 使用状态成员函数进行最佳初始化,以查找哪些部分是有效的
想到的唯一缺点是全有或全无的方法是处理"几乎正确"的输入。如果缺少属性,应用程序可能更喜欢使用默认值。
- vscode下的Arduino代码出现意外编译错误
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++标头错误 C2238 意外标记";"
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- boost::p rogram_options 在指定意外的位置参数时不报告任何错误
- 从 C++ 调用 cURL 命令会返回意外的错误代码,如 1792 和 6656
- Qt5 C++中出现意外"Multiple definition"错误
- 排序程序的意外错误代码
- 在 c++ 中声明向量时出现意外错误
- 函数调用中出现意外编译错误 (C++)
- 使用相同的函数时意外收到"std::out_of_range"错误
- 在第三个 pary 函数中使用矢量引用时出现意外错误
- 创建进程失败,意外错误
- 企业架构师错误:意外符号修复
- 在 Linux C++的两个线程之间使用管道的错误/意外行为
- Mex运行时错误:意外的标准表达式
- Cmake 奇怪的错误:语法错误意外的令牌 ('
- Cuda错误:意外启动失败