2

我一直在开发一个读取 XML 文件的程序,如果 ifstream 无法打开文件,它将抛出 std::ifstream::failure。每当设置 std::ifstream::failbit 或设置 std::ifstream::badbit 时都会引发此异常,并且它们(至少在我看来)是需要处理异常的错误类型。

打开文件后,我使用 RapidXML 创建 DOM 对象,如果失败,它的 parse 函数将抛出 rapidxml::parse_error。在这种情况下,错误并不是真正致命的——它只是错误的输入。无论如何,我认为rapidxml在解析xml文件失败的时候抛出异常还是公平的,但即使我不这么认为,也无所谓,因为我没有太多的选择. 我可以在 RapidXML 中关闭异常,但是我仍然必须手动处理这些异常情况,而且通过异常机制处理它们要容易得多。然而,这绝对是一个阴暗的领域。rapidxml::parse 抛出异常的理由并不像 ifstream 那样明确。

最后一种情况是当我解析 DOM 并遇到意外或未预料到的节点时。显然,尽管有意外的输入,程序仍可以继续执行,但我不希望它这样做。我可以想象在这里抛出一个异常,但我不确定这是否有意义。

所以,我想请教一个小建议:异常处理的一些最佳实践是什么?我尝试通过在构造函数中执行所有这些来在解析文件的类中使用 RAII 习惯用法。我使用 boost::shared_ptr 来实例化文件解析类,因此如果构造函数抛出,boost::shared_ptr 将在删除文件解析类后重新抛出 std::bad_alloc。

当 XML 文件不符合此类的预期时,我可以提出一个论据,我认为在出现意外输入时抛出异常是有意义的,但我真的只是想确保我的思维过程是正确的。

4

1 回答 1

1

您的设计对我来说很有意义:完全初始化或抛出异常。唯一想到的选择是:

  • 状态码
  • 使用状态成员函数尽最大努力初始化以找出哪些部分是有效的

全有或全无方法的唯一缺点是处理“几乎正确”的输入。如果缺少属性,应用程序可能会更喜欢默认值。

于 2011-07-13T05:30:20.803 回答