【问题标题】:Relationship between boost::exception and std::exceptionboost::exception 和 std::exception 之间的关系
【发布时间】:2014-11-18 16:08:42
【问题描述】:

假设有以下代码:

try {
      // Do some boost stuff here
}
catch (const std::exception & stdEx) {
     cout << stdEx.what() << endl;
}

问题:

1) 我知道代码适用于某些 boost 异常,即使 std::exception 和 boost::exception 不在同一继承路径上。那为什么会起作用呢?

2) 它是否适用于所有 boost 异常?换句话说,是否有可以触发低于 std::exception 处理程序的 boost::exception 处理程序的示例?

【问题讨论】:

  • 在没有真正深入研究 Boost 代码的情况下,我怀疑它在适当的编译器上运行时具有遵循 std 版本的条件,因此它们实际上 在相同的继承路径。

标签: c++ boost exception-handling


【解决方案1】:

正如你所说,boost::exception 不是从std::exception 派生的。原因请查看对应的FAQ

尽管在从基本异常类型派生时应该使用虚拟继承,但异常类型(包括标准库中定义的类型)通常不是从虚拟的std::exception 派生的。

如果boost::exception 派生自std::exception,则对此类用户定义类型使用enable_error_info 函数会引入危险的歧义,从而破坏所有catch(std::exception &amp;) 语句。

当然,boost::exception 不应用于替换 std::exception 作为异常类型层次结构中的基本类型。相反,除了std::exception(可能也应该虚拟派生)之外,它应该作为虚拟基础包含在内。

recommendation 是让特定的 boost 异常类(实际上)从 boost::exceptionstd::exception 派生,而不仅仅是从 boost::exception 派生。

一些 boost 库的异常仅来自std::exception(如boost::bad_lexical_cast),一些来自两者(如boost::xpressive::regex_error)。我不知道有哪一个仅源自 boost::exception,所以我想说只捕获 std::exception 应该可以捕获所有内容。

【讨论】:

  • 如果 boost::bad_lexical_cast 不是从 boost::exception 派生的,你如何解释 boost::bad_lexical_cast 可以被 (boost::exception &) 捕获?
  • @James :因为boost::throw_exception 被用于抛出异常,从而丰富了异常——除其他外,动态添加boost::exception 作为基础(有关更多详细信息,请单击链接)。
猜你喜欢
  • 2014-11-05
  • 1970-01-01
  • 2015-04-17
  • 2012-06-12
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多